LINUX.ORG.RU

Cнова преобразование Фурье - откуда магия?

 ,


1

2

День добрый, уже был пост о понимании fft, вот он:

Понимание преобразования Фурье

Все работает, частоты находятся. Но в процессе работы обнаружилась одна интересная особенность, о которой я и хочу спросить.

Пусть есть поток steam, который возвращает 512 целых чисел с частотой 44100

CHUNK = 512
RATE = 44100
freqs=np.fft.fftfreq(CHUNK)
while True:
    data = stream.read(CHUNK)
    data=struct.unpack('%dh'%CHUNK, data)
    w = np.fft.fft(data)
    amp=np.array([np.absolute(x) for x in w])
    idx=np.argmax(amp)
    max_freq=freqs[idx]
    freq_in_hertz=abs(max_freq*RATE)
    print(freq_in_hertz)

Полный код

http://pastebin.com/e091BBc7

Для перевода частоты в герцы мы умножаем частоты, которые вернула fft на частоту дискретизации. Но такой подход несет в себе очевидные минусы, точность хромает. Теперь будем считывать по 4 чанка за раз

CHUNK = 512
RATE = 44100
num_chunks=4
freqs=np.fft.fftfreq(CHUNK*num_chunks)
while True:
    data=list(itertools.chain.from_iterable(struct.unpack('%dh'% CHUNK, stream.read(CHUNK)) for _ in range(num_chunks)))
    after_fft=np.fft.fft(data)
    amp=np.array([np.absolute(x) for x in after_fft])
    idx=np.argmax(amp)
    #print(idx)
    max_freq=freqs[idx]
    freq_in_hertz=abs(max_freq*RATE)
    print (freq_in_hertz)

Все работает, но когда мы переводим в герцы,то просто снова умножаем на частоту дискретизации. Но это же бред, для fft она должна быть в 4 раза меньше,ведь мы кормим ей по 4 чанка за раз. Плюс на вычисление всей этой ерунды время тратится, но как то работает

Почему?



Последнее исправление: helium (всего исправлений: 1)

1.

amp=np.array([np.absolute(x) for x in after_fft])
Можно замеить на
amp=np.abs(after_fft)

2.

RATE = 44100
freqs=np.fft.fftfreq(CHUNK)
Можно заменить на
RATE = 44100
freqs=np.fft.fftfreq(CHUNK, 2*np.pi*RATE)
Тогда
freq_in_hertz=freqs[idx]/(2*np.pi)

3.

freq_in_hertz=abs(max_freq*RATE)
Это неправильный перевод в герцы. Нужно было бы делать так
freq_in_hertz=abs(max_freq/(4*np.pi*np.pi*RATE))

4. fft не должна быть в 4-е раза меньше.

anatoly
()
Ответ на: комментарий от anatoly

Огромное спасибо, буду раскуривать

helium
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.