% ------------------------------------------------------------------------- % *** 2.161 Signal Processing - Continuous and Discrete *** % Tutorial MATLAB Function % % firfs - A simple Frequency-Sampling Linear-Phase FIR filter based on DFT % interpolation. % % Source: Class handout: Frequency Sampling FIR Filters % % Usage : h = firfs(samples) % where samples - is a row vector of N equi-spaced, real values % of the freq. response magnitude. % The samples are interpreted as being equally spaced % around the top half of the unit circle at normalized % (in terms of the Nyquist frequency f_N) frequencies % from 0 to 2(N-1)/(2N-1) x f_N, or at frequencies % 2n/(2N-1)xf_N for n = 0...N-1. % Because the length is odd, the frequency response is not % specified at f_N. % h - is the output impulse response of length 2N-1 (odd). % The filter h is real, and has linear phase, i.e. has symmetric % coefficients obeying h(k) = h(2N+1-k), k = 1,2,...,N+1. % % Version: 1.0 % Author: D. Rowell 10/6/07 % ------------------------------------------------------------------------- % function h = firfs(samples) % % Find the length of the input array... % The complete sample set on the unit circle will be of length (2N-1) % M = length(samples); H_d = zeros(1,2*M-1); % % We want a causal filter, so the resulting impulse response will be shifted % (2N-2)/2 = N-1 to the right, giving a phase shift of exp(-j*Omega*4 % Move the samples into the upper and lower halves of H_d and add the % linear phase shift term to each sample. % Phi = 2*pi*(M-1)/(2*M-1); H_d(1) = samples(1); for j = 2:M Phase = exp(-i*(j-1)*Phi); H_d(j) = samples(j)*Phase; H_d(2*M+1-j) = conj(H_d(j)); end % % Use the inverse DFT to define the impulse response. We know the impulse % response will be real. (Note that MATLAB's fft routines can handle any % length vector.) % h = (ifft(H_d)); %