У меня есть небольшая проблема с управлением данными FFT. Я искал много примеров того, как делать БПФ, но я не мог получить то, что хочу от любого из них. У меня есть случайный волновой файл с частотой дискретизации 44 кГц, и я хочу получить величину N гармоник каждый X мс, скажем, 100 мс должно быть достаточно. Я пробовал этот код:Как получить время/частоту из FFT в Python
import scipy.io.wavfile as wavfile
import numpy as np
import pylab as pl
rate, data = wavfile.read("sound.wav")
t = np.arange(len(data[:,0]))*1.0/rate
p = 20*np.log10(np.abs(np.fft.rfft(data[:2048, 0])))
f = np.linspace(0, rate/2.0, len(p))
pl.plot(f, p)
pl.xlabel("Frequency(Hz)")
pl.ylabel("Power(dB)")
pl.show()
Это был последний пример, который я использовал, я нашел его где-то в stackoverflow. Проблема в том, что это получает величину, которую я хочу, получает частоту, но времени нет. Насколько я знаю, анализ БПФ является 3D, и это «объединенный» результат всех гармоник. Я получаю это:
X-axis = Frequency, Y-axis = Magnitude, Z-axis = Time (invisible)
Из моего понимания кода, т время - и, похоже, что, но не требуется в коде - Мы, возможно, нужно хотя. p - массив мощностей (или величины), но он кажется некоторым средним из всех величин каждой частоты f, который представляет собой массив частот. Я не хочу среднего/объединенного значения, мне нужна величина для N гармоник каждые X миллисекунд.
Короче говоря, мы можем получить: 1 магнитуду всех частот.
Мы хотим: все величины N частот, включая время, когда присутствует определенная величина.
Результат должен выглядеть этот массив: [время, частота, амплитуда] Таким образом, в конце концов, если мы хотим, 3 гармоники, она будет выглядеть так:
[0,100,2.85489] #100Hz harmonic has 2.85489 amplitude on 0ms
[0,200,1.15695] #200Hz ...
[0,300,3.12215]
[100,100,1.22248] #100Hz harmonic has 1.22248 amplitude on 100ms
[100,200,1.58758]
[100,300,2.57578]
[200,100,5.16574]
[200,200,3.15267]
[200,300,0.89987]
Визуализация не требуется, результат должен быть только массивы (или хеши/словари), как указано выше.
Алгоритм быстрого преобразования Фурье (FFT) вычисляет дискретное преобразование Фурье (ДПФ) последовательности или ее обратное. Анализ Фурье преобразует сигнал из его исходного домена (часто время или пробел) в представление в частотной области и наоборот. Я не думаю, что вам нужно получить время, как только вы применили преобразование Фурье по исходному сигналу. Он преобразуется в частотную область. Аналогичным образом, когда вы применяете обратное преобразование Фурье по сигналу частотной области, вы получаете сигнал временной области. Читайте здесь больше. https://en.wikipedia.org/wiki/Fast_Fourier_transform –
Спасибо за комментарий, хотя вы объяснили мне, как работает алгоритм, но я до сих пор не знаю, можно ли получить такой вывод от него или ему нужно совершенно по-другому. Соответственно, как, если не с FFT, вы можете получить результат, который я описал. Зная, как именно в одну точку БПФ работа не решит вопрос. – Dulcia
Ум ... если я инвертирую преобразование Фурье, я получу сигнал временной области, но это оригинал, не так ли? Кроме того, я до сих пор не знаю, где я могу получить все три значения. – Dulcia