如何使用 MATLAB 在频率上正确带通滤波器?

时间:2021-03-05 15:39:27

标签: matlab signal-processing fft

我对 matlab 和信号处理还很陌生,但我正在做一个项目却被卡住了。我的目标是做一个带通快速傅里叶变换 (FFT) 滤波器,其截止频率为来自真实信号的 0.5 Hz 和 3 Hz。我的输入信号是一个采样频率为 405Hz 的信号,大约有 35000 个样本。我的实现如下所示:

%ZFiltered = My signal 
filtered = bandpass(fft(zFiltered), [0.5 3], sampling_frequency);
res = ifft(filtered);

subplot(2,1,1)
plot(zFiltered)

subplot(2,1,2)
plot(abs(res))

我的问题是:为什么我得到的信号也包含虚部?为什么它看起来像 this

1 个答案:

答案 0 :(得分:2)

我不清楚你的目标;这是您的问题暗示的三种不同方法

  1. 按照您的代码尝试使用带通滤波器过滤原始信号
  2. 使用 fftifft 函数过滤原始信号
  3. 计算与 filter 函数一起使用时可用作带通滤波器的数字滤波器的系数

方法 1:使用 bandpass 函数过滤

参考 bandpass documentation,您将使用原始信号并指定滤波器频带和采样频率,如下所示:

filtered_signal = bandpass(zFiltered,[freq_low freq_high],sample_freq);
plot(zFiltered); hold on;
plot(filtered_signal);

输入在哪里

  • zFiltered :原始(未过滤的信号)
  • freq_low=0.5 :带通范围的最低频率(Hz)`
  • freq_high=3 :带通范围的最高频率(Hz)
  • sample_freq=405 : 采样频率 (Hz)

您使用数字快速傅立叶变换函数 fft 的方法会产生复杂的结果,因为您正在查看由变换计算的实际分量(根据定义,这些分量是复杂的,具有实部和虚部)。您可以使用以下命令计算信号的功率:

P = abs(res/n).^2;

它为您提供傅立叶变换中表示的每个频率的信号功率(有关详细信息,请参阅 fft 函数文档 here)。


方法 2:使用 fft ifft 函数过滤

使用傅里叶变换和傅里叶逆变换函数对信号进行滤波。这里的步骤是使用 fft 将信号放入频域。将要过滤的元素设置为零,然后应用傅立叶逆变换 (ifft) 以获得过滤后的信号。每个分量代表在 0Hz 和 F_s/2 之间的范围内对信号有贡献的给定离散频率。将要抑制的 FFT 组件设置为 zoro 并应用 ifft 以获取滤波器信号。请参阅 fft docsifft docs 以了解有关这些功能以及在频域中处理信号的一些复杂性的信息。


方法 3:用标准差分方程的系数进行过滤

计算数字带通滤波器的系数。此方法计算标准差分方程的系数(向量 AB)(有关详细信息,请参阅 filter docs)。执行此操作的函数示例是 butter,它给出表示给定频率的巴特沃斯滤波器的系数。您还可以查看 designfilt 函数以获取更多选项。

相关问题