ローパスフィルターをバンドパスフィルターに変換する方法
-
03-07-2019 - |
質問
次の伝達関数で記述されるローパスフィルターがあります:
h [n] =(w_c / Pi)* sinc(n * w_c / Pi)、ここでw_cはカットオフ周波数です
このローパスフィルターをバンドパスフィルターに変換する必要があります。
解決
あなたは 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
。
詳細については、離散時間フーリエ変換を参照してください。
注:このようなフィルターは0に関して対称ではありません。つまり、複雑な値を持つことになります。対称にするためには、 exp(-j * w_offset * n)
を掛けた h [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)
このフィルターは純粋に実数値を持ちます。
他のヒント
簡単な答えは、時間領域で複素指数を掛けることです。時間領域での乗算は、周波数領域で信号をシフトします。
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) );
p.s。数週間前、学校にこの機能を実装したばかりです。
ウィンドウ方式を使用して独自のバンドパスフィルターを作成するためのコードを次に示します。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 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
f [n]
を、希望する帯域の下限にある w_c
でローパスフィルターから取得する信号とします。元の信号から f [n]
を引くことにより、この下限を超える周波数を取得できます。これは、2番目のローパスフィルターに必要な入力です。