Получить частоту с наибольшей амплитудой из БПФ
У меня есть необработанные данные акселерометра в виде осей x,y,z, которые сглаживаются, и я применил полосовой фильтр. Теперь я хочу преобразовать его в сигнал частотной области и используя scipy.fftpack.fft
применять БПФ.
sampling_frequency = 32
def fft(acc_data):
N = len(acc_data)
fft_data = sp.fftpack.fft(acc_data)
freqs = sp.fftpack.fftfreq(N)
plt.bar(freqs, np.abs(fft_data))
plt.xlabel('Frequency in Hertz [Hz]')
plt.ylabel('Magnitude')
plt.title('FFT')
plt.show()
Эта фигура не имеет построенных точек и является пустой. Возвращаемое значение fft представляет собой сложный массив. я использую fftfreq
чтобы получить частоту наибольшей амплитуды.
Может кто-то указать, где это неправильно или привести пример того, как получить значение частоты с наибольшей амплитудой, применяя БПФ?
Полный код этого доступен здесь
1 ответ
Я предлагаю вам отойти от своего кода и способности первого мастера выполнить вызов fft и разобраться в результате, возвращаемом этим вызовом... либо читать по кривой греха известного freq, либо просто написать функцию для заполнения массива Кривая с плавающей запятой (это ваш сигнал во временной области) ... затем передайте этот массив в вызов fft, который, как правило, вернет вам новый массив комплексных чисел... каждый элемент этого нового массива, который теперь находится в частотная область представляет одно значение частоты... частотный интервал... величина этой частоты может быть рассчитана с использованием
nyquist_limit_index := int(number_of_samples / 2)
curr_freq := 0.0
incr_freq := flow_data_spec.sample_rate / number_of_samples
for index, curr_complex := range complex_fft {
if index <= nyquist_limit_index {
curr_real = real(curr_complex) // pluck out real portion of imaginary number
curr_imag = imag(curr_complex) // ditto for im
curr_mag = 2.0 * math.Sqrt(curr_real*curr_real+curr_imag*curr_imag) / number_of_samples
curr_theta = math.Atan2(curr_imag, curr_real) // phase shift of this freq
curr_dftt := discrete_fft { // populate a struct of current array element
real: 2.0 * curr_real,
imaginary: 2.0 * curr_imag,
magnitude: curr_mag,
theta: curr_theta,
}
// optionally stow curr_dftt for later
}
curr_freq += incr_freq
}
где number_of_samples - это длина вашего массива временной области, который вы указали в вызове fft.
Приведенный выше код показывает вам, как выполнять итерацию по массиву частотной области комплексных чисел, возвращенных вам из более раннего вызова fft... выше псевдокод, а не python, но ваш процесс может быть очень похож
Чтобы определить частоту ( curr_freq) с наибольшей амплитудой, просто следите за тем, какая из которых curr_freq имела максимальную амплитуду в вышеуказанном цикле... В нашей игрушечной настройке вы можете хорошо знать частоту входной синусоидальной кривой вашего источника, так что такая же частота должна выскочить как curr_freq с наибольшей величиной выше... после того, как вы это заработаете и его концепции погрузятся в жизнь, затем примените то, что вы узнали, к вашей задаче - удачи
Анализ Фурье и его различные заклинания чрезвычайно мощны и могут открыть много дверей. Это тема, требующая обдумывания, но если мы позволим себе просто соединить некоторые вызовы API, чтобы что-то заработало, мы действительно упустили нечто очень волшебное