如何使用 MATLAB 在频率上正确带通滤波器?
How to correctly bandpass filter in frequency with MATLAB?
我对 matlab 和信号处理还很陌生,但我正在做一个项目,但我被卡住了。我的目标是对真实信号进行截止频率为 0.5 Hz 和 3 Hz 的带通快速傅里叶变换 (FFT) 滤波器。我的输入信号是一个 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:使用 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
: 以赫兹为单位的采样频率
您使用数字快速傅里叶变换函数的方法 fft
会产生复杂的结果,因为您正在查看由变换计算的实际分量(根据定义,它是复杂的,具有实部和虚部)。您可以使用以下方法计算信号的功率:
P = abs(res/n).^2;
它为您提供傅立叶变换中表示的每个频率的信号功率(有关详细信息,请参阅 fft
函数文档 here)。
方法 2:使用 fft
ifft
函数过滤
使用傅里叶变换和傅里叶逆变换函数对信号进行滤波。这里的步骤是使用fft
让信号进入频域。将要过滤的元素设置为零,然后应用傅里叶逆变换 (ifft
) 以获得过滤后的信号。每个分量代表一个给定的离散频率,范围在 0Hz 和 F_s/2
之间,对信号有贡献。将要抑制的 FFT 分量设置为 zoro 并应用 ifft
以取回滤波器信号。请参阅 fft
docs and ifft
docs 了解有关这些函数的信息以及在频域中处理信号的一些复杂性。
方法 3:使用标准差分方程的系数进行过滤
计算数字带通滤波器的系数。这种方法计算标准差分方程的系数(向量 A
和 B
)(详见 filter
docs)。执行此操作的函数示例是 butter
,它给出了表示给定频率的巴特沃斯滤波器的系数。您还可以查看 designfilt
函数以获得更多选项。
我对 matlab 和信号处理还很陌生,但我正在做一个项目,但我被卡住了。我的目标是对真实信号进行截止频率为 0.5 Hz 和 3 Hz 的带通快速傅里叶变换 (FFT) 滤波器。我的输入信号是一个 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:使用 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
: 以赫兹为单位的采样频率
您使用数字快速傅里叶变换函数的方法 fft
会产生复杂的结果,因为您正在查看由变换计算的实际分量(根据定义,它是复杂的,具有实部和虚部)。您可以使用以下方法计算信号的功率:
P = abs(res/n).^2;
它为您提供傅立叶变换中表示的每个频率的信号功率(有关详细信息,请参阅 fft
函数文档 here)。
方法 2:使用 fft
ifft
函数过滤
使用傅里叶变换和傅里叶逆变换函数对信号进行滤波。这里的步骤是使用fft
让信号进入频域。将要过滤的元素设置为零,然后应用傅里叶逆变换 (ifft
) 以获得过滤后的信号。每个分量代表一个给定的离散频率,范围在 0Hz 和 F_s/2
之间,对信号有贡献。将要抑制的 FFT 分量设置为 zoro 并应用 ifft
以取回滤波器信号。请参阅 fft
docs and ifft
docs 了解有关这些函数的信息以及在频域中处理信号的一些复杂性。
方法 3:使用标准差分方程的系数进行过滤
计算数字带通滤波器的系数。这种方法计算标准差分方程的系数(向量 A
和 B
)(详见 filter
docs)。执行此操作的函数示例是 butter
,它给出了表示给定频率的巴特沃斯滤波器的系数。您还可以查看 designfilt
函数以获得更多选项。