如何用MATLAB正确地实现频率带通滤波器?

如何用MATLAB正确地实现频率带通滤波器?,matlab,signal-processing,fft,Matlab,Signal Processing,Fft,我对matlab和信号处理相当陌生,但我正在做一个项目,我被卡住了。我的目标是做一个带通快速傅里叶变换(FFT)滤波器,截止频率为0.5 Hz和3 Hz,来自真实信号。我的输入信号是从AD405Hz采样的信号,大约有35000个样本。我的实现如下所示: %ZFiltered = My signal filtered = bandpass(fft(zFiltered), [0.5 3], sampling_frequency); res = ifft(filtered); subplot(2,

我对matlab和信号处理相当陌生,但我正在做一个项目,我被卡住了。我的目标是做一个带通快速傅里叶变换(FFT)滤波器,截止频率为0.5 Hz和3 Hz,来自真实信号。我的输入信号是从AD405Hz采样的信号,大约有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))

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

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

  • 当您的代码尝试这样做时,使用带通滤波器过滤原始信号
  • 使用和函数过滤原始信号
  • 计算数字滤波器的系数,该数字滤波器在与函数一起使用时将充当带通滤波器

  • 方法1:使用
    带通功能进行过滤

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

    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\u freq=405
      :以Hz为单位的采样频率
    您使用数字快速傅里叶变换函数的方法会产生复杂的结果,因为您正在查看由变换计算的实际分量(根据定义,这些分量是具有实部和虚部的复数)。您可以使用以下公式计算信号的功率:

    P = abs(res/n).^2;
    
    这为您提供了傅里叶变换中表示的每个频率的信号功率(有关更多信息,请参阅
    fft
    函数文档)


    方法2:使用
    fft
    ifft
    功能进行滤波

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


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


    计算数字带通滤波器的系数。这种方法计算标准差分方程的系数(向量
    A
    B
    )(详见)。执行此操作的函数示例是
    butter
    ,它给出了表示给定频率的Butterworth滤波器的系数。您还可以查看
    designfilt
    函数以了解更多选项。

    我不清楚您的目标;以下是您的问题所暗示的三种不同方法

  • 当您的代码尝试这样做时,使用带通滤波器过滤原始信号
  • 使用和函数过滤原始信号
  • 计算数字滤波器的系数,该数字滤波器在与函数一起使用时将充当带通滤波器

  • 方法1:使用
    带通功能进行过滤

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

    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\u freq=405
      :以Hz为单位的采样频率
    您使用数字快速傅里叶变换函数的方法会产生复杂的结果,因为您正在查看由变换计算的实际分量(根据定义,这些分量是具有实部和虚部的复数)。您可以使用以下公式计算信号的功率:

    P = abs(res/n).^2;
    
    这为您提供了傅里叶变换中表示的每个频率的信号功率(有关更多信息,请参阅
    fft
    函数文档)


    方法2:使用
    fft
    ifft
    功能进行滤波

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


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

    计算数字带通滤波器的系数。这种方法计算标准差分方程的系数(向量
    A
    B
    )(详见)。执行此操作的函数示例是
    butter
    ,它给出了表示给定频率的Butterworth滤波器的系数。您还可以查看
    designfilt
    函数以了解更多选项