2015-01-21 1 views
0

Я ищу самую частоту в периодическом сигнале. Я пытаюсь понять, что мне получить, если я выполняю преобразование Фурье по периодическому сигналу и фильтрую для частот, имеющих отрицательные значения fft.Фурье-преобразование и частоты фильтрации с отрицательными значениями fft

Другими словами, что означает ось графиков 2 и 3 (см. Ниже)? Я рисую частоту (циклы/секунда) по fft-преобразованному сигналу - что означают отрицательные значения на оси y, и было бы ли смысл, что меня будут интересовать только те, кто?

import numpy as np 
import scipy 

# generate data 
time = scipy.linspace(0,120,4000) 
acc = lambda t: 10*scipy.sin(2*pi*2.0*t) + 5*scipy.sin(2*pi*8.0*t) + 2*scipy.random.random(len(t)) 
signal = acc(time) 

# get frequencies from decomposed fft 
W = np.fft.fftfreq(signal.size, d=time[1]-time[0]) 
f_signal = np.fft.fft(signal) 

# filter signal 
# I'm getting only the "negative" part! 
cut_f_signal = f_signal.copy() 
# filter noisy frequencies 
cut_f_signal[(W < 8.0)] = 0 
cut_f_signal[(W > 8.2)] = 0 

# inverse fourier to get filtered frequency 
cut_signal = np.fft.ifft(cut_f_signal) 

# plot 
plt.subplot(221) 
plt.plot(time,signal) 
plt.subplot(222) 
plt.plot(W, f_signal) 
plt.subplot(223) 
plt.plot(W, cut_f_signal) 
plt.subplot(224) 
plt.plot(time, cut_signal) 
plt.show() 

Fourier transform and signal filtering

+0

BTW, прямоугольный фильтр (обнуление бункеров) в частотной области является невероятно шумным, не плоский фильтр с потенциалом т пульсации и звона. – hotpaw2

ответ

2

БПФ из вещественного входного сигнала будет производить сопряженную симметричный результат. (Это как раз то, как математика работает лучше всего.) Таким образом, для значений результата FFT только реальных данных отрицательные частоты являются просто зеркальными дубликатами положительных частот и поэтому могут быть проигнорированы при анализе результата.

Однако, если вы хотите сделать инверсию и вычислить IFFT, вам нужно будет подавать IFFT сопряженную симметричную отрицательную половину (или верхнюю половину, выше Fs/2) частотных данных, иначе результат вашего IFFT закончится (например, с ненулевыми мнимыми (sqrt (-1)) компонентами, редко, что нужно при работе с реальными данными базовой полосы).

Если вы хотите отфильтровать данные FFT и получить реальные результаты от IFFT, вам необходимо будет отфильтровать положительную и отрицательную частоты симметрично одинаково, чтобы поддерживать необходимую симметрию.

БПФ также производит сложный результат, где значение и знак компонентов (вещественного и мнимого) каждого бина результата представляют фазу, а также величину базового вектора компонента (сложную синусоиду или действительный косинус плюс реальный синусоидальные компоненты). Любое отрицательное значение просто представляет поворот фазы, если тот же результат был положительным.

+0

Спасибо за ввод, однако, мой вопрос заключается не в отрицательных значениях частоты (которые являются зеркалом положительных) - в моем примере по оси x, а о отрицательных по оси y, которые поступают из БПФ - что они имеют в виду? – afrendeiro

+0

Ответ обновлен относительно подписанных комплексных результатов FFT. – hotpaw2

+0

Спасибо также за намек на фильтрацию шума симметрично – afrendeiro

0

Как @ hotpaw2 уже написал в своем комментарии выше, результат БПФ, выполненный на реальном сигнале во временной области, генерирует сложные значения в частотной области.

Входное значение f_signal вашей команды plot представляет собой вектор сложных значений.

plt.subplot(222) 
plt.plot(W, f_signal) 

Это приводит к бессмысленному выходу. Вы должны построить абсолютные значения f_signal. Если вас интересует фаза, вы также должны нанести угол. В Matlab это будет выглядеть так:

% Plot the absolute values of f_signal 
plot(W, abs(f_signal)); 
% Plot the phase of f_signal 
plot(W, (unwrap(angle(f_signal))); 

 Смежные вопросы

  • Нет связанных вопросов^_^