How to convert a lowpass filter to a bandpass filter

I have a low-pass filter described by the following transfer function:

h [n] = (w_c / Pi) * sinc (n * w_c / Pi), where w_c is the cutoff frequency

I need to convert this lowpass filter to a bandpass filter.

+4
source share
3 answers

You h[n] convert to rect in the frequency domain. To make this a passband, you need to move its center frequency higher.

To do this, multiply h[n] by exp(j*w_offset*n) , where w_offset is the amount to be shifted. If w_offset positive, you go to higher frequencies.

Multiplication in the time domain is a convolution in the frequency domain. Since exp(j*w_offset*n) turns into a pulse function centered on w_offset , multiplication shifts H(w) by w_offset .

See the Discrete Fourier Transform for more details.

Note : such a filter will not be symmetrical with respect to 0, which means that it will have complex values. To make it symmetrical, you need to add h[n] times exp(-j*w_offset*n) :

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

Since cos(w*n) = (exp(j*w*n)+exp(-j*w*n))/2 we get:

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

This filter has purely real values.

+4
source

The short answer is that you are multiplying by a complex exponent in the time domain. Multiplication in the time domain will shift the signal in the frequency domain.

Matlab Code:

 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) ); 

ps I happen to have just implemented this exact functionality for school a couple of weeks ago.

Here is the code to create your own bandwidth filter using the windowing method:

 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 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 ( ie 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() 

An example of using this function:

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

Let f[n] be the signal that you receive from the low-pass filter with w_c at the lower boundary of the desired band. You can get frequencies above this lower bound by subtracting f[n] from the original signal. This is the input you want to use for the second low pass filter.

0
source

All Articles