Получить частоту с наибольшей амплитудой из БПФ - PullRequest
1 голос
/ 16 апреля 2019

У меня есть необработанные данные акселерометра в виде осей 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 Ответ

1 голос
/ 16 апреля 2019

Я предлагаю вам отойти от своего кода и способности первого мастера выполнить вызов 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) с thСамая большая амплитуда, просто следите за тем, какая из curr_freq имела максимальную амплитуду в вышеупомянутом цикле ... В нашей игрушечной настройке вы можете хорошо знать частоту входной синусоидальной кривой вашего источника, так что такая же частота должна выскочить как curr_freq с наибольшей величиной выше... после того, как вы это заработаете и его концепции погрузятся в жизнь, примените то, что вы узнали, к своей задаче - удачи

Анализ Фурье и его различные заклинания чрезвычайно эффективны и могут открыть множество дверей.Это тема, требующая обдумывания, но если мы позволим себе просто соединить некоторые вызовы API, чтобы что-то заработало, мы упустили нечто очень волшебное

...