【问题标题】:How to convert a low-pass filter to a band-pass filter如何将低通滤波器转换为带通滤波器
【发布时间】:2010-10-23 16:27:02
【问题描述】:

我有一个由以下传递函数描述的低通滤波器:

h[n] = (w_c/Pi) * sinc( n * w_c / Pi ),其中 w_c 为截止频率

我必须将此低通滤波器转换为带通滤波器。

【问题讨论】:

    标签: signal-processing


    【解决方案1】:

    让f[n] 成为您从低通滤波器获得的信号,w_c 在所需频段的下限。您可以通过从原始信号中减去f[n] 来获得高于此下限的频率。这是您想要用于第二个低通滤波器的输入。

    【讨论】:

      【解决方案2】:

      您的h[n] 在频域中转换为rect。要使其带通,您需要将其中心频率提高。

      为此,将h[n] 乘以exp(j*w_offset*n),其中w_offset 是移位量。如果w_offset 是正数,那么你会转向更高的频率。

      时域的乘法是频域的卷积。由于exp(j*w_offset*n) 变成了以w_offset 为中心的脉冲函数,因此乘法将H(w) 移动了w_offset。

      请参阅Discrete Time Fourier Transform 了解更多详情。

      注意:这样的过滤器不会关于 0 对称,这意味着它会有复数值。要使其对称,您需要添加h[n] 乘以exp(-j*w_offset*n):

      h_bandpass[n] = h[n](exp(j*w_offset*n)+exp(-j*w_offset*n))

      由于cos(w*n) = (exp(j*w*n)+exp(-j*w*n))/2 我们得到:

      h_bandpass[n] = h[n]cos(w_offset*n)

      这个过滤器具有纯实值。

      【讨论】:

      • @freespace,“过滤器是可实现的,因为它具有纯实值”您的意思是复值系数使过滤器无法实现……您错了。当您有复数系数时,您可以进行复数乘法和复数加法(每个复数乘法是 4 个实数乘法和 2 个实数加法)。
      • @Trevor Boyd Smith:我很抱歉,你是对的。我最初的回答只是考虑了实际值信号发生的情况——你会得到一个复杂的值输出,我认为扬声器是没用的。但在某些情况下,信号本身很复杂,复杂的输出是预期的和有用的。
      • 我发现这个结果相当惊人。数学很美。
      【解决方案3】:

      简短的回答是,您将乘以时域中的复指数。时域中的乘法将在频域中移动信号。

      Matlab 代码:

      n_taps = 100;
      n = 1:n_taps;
      h = ( w_c / Pi ) * sinc( ( n - n_taps / 2) * w_c / Pi ) .* ...
          exp( i * w_offset * ( n - n_taps / 2) );
      

      附言几周前我碰巧刚刚为学校实现了这个确切的功能。

      这是使用窗口方法创建您自己的带通滤波器的代码:

      %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
      % Function: Create bandpass filter using windowing method
      % Purpose:  Simple method for creating filter taps ( useful when more elaborate
      %           filter design libraries are not available )
      %
      % @author   Trevor B. Smith, 24MAR2009
      %
      % @param    n_taps    How many taps are in your output filter
      % @param    omega_p1  The lower cutoff frequency for your passband filter
      % @param    omega_p2  The upper cutoff frequency for your passband filter
      % @return   h_bpf_hammingWindow     The filter coefficients for your passband filter
      %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
      function h_bpf_hammingWindow = BPF_hammingWindow(n_taps,omega_p1,omega_p2)
          % Error checking
          if( ( omega_p2 == omega_p1 ) || ( omega_p2 < omega_p1 ) || ( n_taps < 10 ) )
              str = 'ERROR - h_bpf_hammingWindow():   Incorrect input parameters'
              h_bpf_hammingWindow = -1;
              return;
          end
      
          % Compute constants from function parameters
          length = n_taps - 1; % How many units of T ( i.e. how many units of T, sampling period, in the continuous time. )
          passbandLength = omega_p2 - omega_p1;
          passbandCenter = ( omega_p2 + omega_p1 ) / 2;
          omega_c = passbandLength / 2; % LPF omega_c is half the size of the BPF passband
          isHalfSample = 0;
          if( mod(length,2) == 1 )
              isHalfSample = 1/2;
          end
      
          % Compute hamming window
          window_hamming = hamming(n_taps);
      
          % Compute time domain samples
          n = transpose(-ceil(length/2):floor(length/2));
          h1 = sinc( (1/pi) * omega_c * ( n + isHalfSample ) ) * pi .* exp( i * passbandCenter * ( n + isHalfSample ) );
      
          % Window the time domain samples
          h2 = h1 .* window_hamming;
          if 1
              figure; stem(h2); figure; freqz(h2);
          end
      
          % Return filter coefficients
          h_bpf_hammingWindow = h2;
      end % function BPF_hammingWindow()
      

      如何使用此功能的示例:

      h_bpf_hammingWindow = BPF_hammingWindow( 36, pi/4, 3*pi/4 );
      freqz(h_bpf_hammingWindow); % View the frequency domain
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-10
        • 2014-07-29
        • 1970-01-01
        • 2011-05-29
        • 2019-04-29
        • 2015-05-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多