www.gusucode.com > dsp 案例源码程序 matlab代码 > dsp/FIRNyquistLthBandFilterDesignExample.m
%% FIR Nyquist (L-th band) Filter Design % This example shows how to design lowpass FIR Nyquist filters. It also % compares these filters with raised cosine and square root raised cosine % filters. These filters are widely used in pulse-shaping for digital % transmission systems. They also find application in % interpolation/decimation and filter banks. % Copyright 1999-2015 The MathWorks, Inc. %% Magnitude Response Comparison % The plot shows the magnitude response of an equiripple Nyquist filter and % a raised cosine filter. Both filters have an order of 60 and a % rolloff-factor of 0.5. Because the equiripple filter has an optimal % equiripple stopband, it has a larger stopband attenuation for the same % filter order and transition width. The raised-cosine filter is obtained % by truncating the analytical impulse response and it is not optimal in % any sense. NBand = 4; N = 60; % Filter order R = 0.5; % Rolloff factor TW = R/(NBand/2); % Transition Bandwidth f1 = fdesign.nyquist(NBand,'N,TW',N,TW); eq = design(f1,'equiripple','Zerophase',true,'SystemObject',true); coeffs = rcosdesign(R,N/NBand,NBand,'normal'); coeffs = coeffs/max(abs(coeffs))/NBand; rc = dsp.FIRFilter('Numerator',coeffs); fvt = fvtool(eq,rc,'Color','white'); legend(fvt,'Equiripple NYQUIST design','Raised Cosine design'); %% % In fact, in this example it is necessary to increase the order of the % raised-cosine design to about 1400 in order to attain similar % attenuation. %% Impulse Response Comparison % Here we compare the impulse responses. Notice that the impulse response % in both cases is zero every 4th sample (except for the middle sample). % Nyquist filters are also known as L-th band filters, because the cutoff % frequency is Pi/L and the impulse response is zero every L-th sample. In % this case we have 4th band filters. f1.FilterOrder = 38; eq1 = design(f1,'equiripple','Zerophase',true,'SystemObject',true); coeffs = rcosdesign(R,f1.FilterOrder/NBand,NBand,'normal'); coeffs = coeffs/max(abs(coeffs))/NBand; rc1 = dsp.FIRFilter('Numerator',coeffs); fvt = fvtool(eq1,rc1,'Color','white','Analysis','Impulse'); legend(fvt,'Equiripple NYQUIST','Raised Cosine'); title('Impulse response, Order=38, Rolloff = 0.5'); %% Nyquist Filters with a Sloped Stopband % Equiripple designs allow for control of the slope of the stopband of the % filter. For example, the following designs have slopes of 0, 20, and 40 % dB/(rad/sample)of attenuation: f1.FilterOrder = 52; f1.Band = 8; f1.TransitionWidth = .05; eq1 = design(f1,'equiripple','SystemObject',true); eq2 = design(f1,'equiripple','StopbandShape','linear',... 'StopbandDecay',20,'SystemObject',true); eq3 = design(f1,'equiripple','StopbandShape','linear',... 'StopbandDecay',40,'SystemObject',true); fvt = fvtool(eq1,eq2,eq3,'Color','white'); legend(fvt,'Slope=0','Slope=20','Slope=40') %% Minimum-Phase Design % We can design a minimum-phase spectral factor of the overall Nyquist % filter (a square-root in the frequency domain). This spectral factor can % be used in a similar manner to the square-root raised-cosine filter in % matched filtering applications. A square-root of the filter is placed on % the transmiter's end and the other square root is placed at the % receiver's end. f1.FilterOrder = 30; f1.Band = NBand; f1.TransitionWidth = TW; eq1 = design(f1,'equiripple','Minphase',true,'SystemObject',true); coeffs = rcosdesign(R,N/NBand,NBand); coeffs = coeffs / max(coeffs) * (-1/(pi*NBand) * (pi*(R-1) - 4*R)); srrc = dsp.FIRFilter('Numerator',coeffs); fvt = fvtool(eq1,srrc,'Color','white'); legend(fvt,'Minimum-phase equiripple design',... 'Square-root raised-cosine design'); %% Decreasing the Rolloff Factor % The response of the raised-cosine filter improves as the rolloff factor % decreases (shown here for rolloff = 0.2). This is because of the narrow % main lobe of the frequency response of a rectangular window that is used % in the truncation of the impulse response. f1.FilterOrder = N; f1.TransitionWidth = .1; eq1 = design(f1,'equiripple','Zerophase',true,'SystemObject',true); R = 0.2; coeffs = rcosdesign(R,N/NBand,NBand,'normal'); coeffs = coeffs/max(abs(coeffs))/NBand; rc1 = dsp.FIRFilter('Numerator',coeffs); fvt = fvtool(eq1,rc1,'Color','white'); legend(fvt,'NYQUIST equiripple design','Raised Cosine design'); %% Windowed-Impulse-Response Nyquist Design % Nyquist filters can also be designed using the truncated-and-windowed % impulse response method. This can be another alternative to the % raised-cosine design. For example we can use the Kaiser window method to % design a filter that meets the initial specs: f1.TransitionWidth = TW; kaiserFilt = design(f1,'kaiserwin','SystemObject',true); %% % The Kaiser window design requires the same order (60) as the equiripple % design to meet the specs. (Remember that in contrast we required an % extraordinary 1400th-order raised-cosine filter to meet the stopband % spec.) fvt = fvtool(eq,rc,kaiserFilt,'Color','white'); legend(fvt,'Equiripple design',... 'Raised Cosine design','Kaiser window design'); %% Nyquist Filters for Interpolation % Besides digital data transmission, Nyquist filters are attractive for % interpolation purposes. The reason is that every L samples you have a % zero sample (except for the middle sample) as mentioned before. There are % two advantages to this, both are obvious by looking at the polyphase % representation. fm = fdesign.interpolator(4,'nyquist'); kaiserFilt = design(fm,'kaiserwin','SystemObject',true); fvt = fvtool(kaiserFilt,'Color','white'); fvt.PolyphaseView = 'on'; %% % The polyphase subfilter #4 is an allpass filter, in fact it is a pure % delay (select impulse response in FVTool, or look at the filter % coefficients in FVTool), so that: % 1. All of its multipliers are zero except for one, leading to an % efficient implementation of that polyphase branch. % 2. The input samples are passed through the interpolation filter without % modification, even though the filter is not ideal.