在频域中过滤采样信号(FFT)

时间:2015-07-19 21:19:15

标签: matlab filtering fft

我用示波器捕获滤波器的输入信号,我正在尝试在滤波后计算信号。

所以我认为我做的是这个:

  1. 使用FFT
  2. 将信号转换到频域
  3. 将其与我的过滤器H(w)的传递函数相乘
  4. 使用IFFT将其转换回时域
  5. 然而,它并不像我预期的那样完全正常。

    为了得到真实的结果,我对IFFT的输入需要具有共轭对称性。因此,为了实现这一点,我的传递函数也需要具有共轭对称性。

    为了达到这个目的,我创建了一个镜像频率向量,其中第二个减半 (由于负频率的传递函数将是正频率的结果的复共轭)。

    IFFT的结果输出是真实的,但信号与我的测量结果不符。 (虚构部分实际上非常小,我认为浮点错误)

    然而,如果我只是镜像我的频率向量(没有负频率),那么在转换到时域之后,信号的实部似乎与我的测量值相匹配。但在那种情况下,我扔掉了想象中的部分(这是 完全不是零,这似乎不对。所以我想知道这是不是巧合。

    我已经用PSpice检查了传输函数的正确性,所以我知道它是正确的。

    任何人都可以告诉我我的方法有什么问题吗?

    % Input signal is in 'data' 
    % Sampling frequency
    fs = 25e6;
    
    % Create time vector 
    dt = 1/fs;
    time = linspace(0,(length(data)-1)*dt,length(data))';
    
    % FFT of sampled input data
    data_fft = fft(data);
    
    % Create frequency vector (for even number of samples)
    freq = [ 0:length(data)/2 -(length(data)/2-1:-1:1) ] * fs/length(data);
    % freq = [ 0:length(data)/2  (length(data)/2-1:-1:1) ] * fs/length(data); 
    freq = freq';
    
    % Filter
    C1 = 2.2e-6;
    C2 = 2.2e-6;
    L1 = 0;
    rd = 1;
    H = pi_filter(2*pi*freq, C1,C2,L1,rd);
    
    % Apply filter
    data_fft_filtered = data_fft .* H;
    
    % Convert signal back to time domain
    data_filtered = real(ifft(data_fft_filtered)); % Imag part should be zero.
    

    pi_filter.m:

    function gain=pi_filter(w, C1, C2, L1, rd)
        a = -(C1 .* L1 .* w.^2 - 1) ./ ( (C1 .* L1 .* w.^2 - 1).^2 + w.^2 .* rd.^2 .* (C1 - C1.*C2.*L1.*w.^2 + C2).^2 );
        b = ( -1 .* w .* rd .* (C1 - C1 .* C2 .* L1 .* w.^2 + C2)) ./ ( (C1 .* L1 .* w.^2 - 1).^2 + w.^2 .* rd.^2 .* (C1 - C1.*C2.*L1.*w.^2 + C2).^2 );
        gain = complex(a,b);
    end
    

    修改

    我在评论中添加了pi_filter函数的代码。

    我还添加了一些输入信号的截图。 实际数据有点大(50mb),但是当我回到我的电脑上时,我可以将它上传到我的Dropbox,如果这样会有所帮助。

    蓝色:输入信号,红色:计算输出信号,绿色:测量输出信号

    enter image description here enter image description here

    这是我的滤波器(和传递函数)的频率(幅度和相位)响应。 红色图用于上面示例代码中使用的参数。

    Frequency Response

0 个答案:

没有答案