День добрый, уже был пост о понимании 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)
Полный код
Для перевода частоты в герцы мы умножаем частоты, которые вернула 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 чанка за раз. Плюс на вычисление всей этой ерунды время тратится, но как то работает
Почему?