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
source share