⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eziir16.m

📁 是学习matlab的很好程序资料 可以用来方便设计iir滤波器
💻 M
字号:

Ni=500;             % Number of impulses required for Impulse response
FMAT=16;            % 16 bit representation or 32 bit representation
disp('ezIIR FILTER DESIGN SCRIPT');
disp('Butterworth       : 1');
disp('Chebyshev(Type 1) : 2');
disp('Chebyshev(Type 2) : 3');
disp('Elliptic          : 4');
ftype=input('Select Any one of the above IIR Filter Type     : ');
disp('Low pass          : 1');
disp('High Pass         : 2');
disp('Band Pass         : 3');
disp('Band Stop         : 4');
fres=input('Select Any one of the above Response            : ');
fs=input('Enter the Sampling frequency                    : ');
Rp=input('Enter the Pass band Ripples in dB(RP)           : ');
Rs=input('Enter the stop band Rippled in dB(RS)           : ');
Wp=input('Enter the pass band corner frequency(FP)        : ');
Ws=input('Enter the stop band corner frequency(FS)        : ');
fname=input('Enter the name of the file for coeff storage    : ','s');

% Design the Filter
if fres==1
    res='low';
   elseif fres==2
      res='high';
   elseif fres==3
      res='bandpass';
   elseif fres==4
      res='stop';
end

Wp=Wp/(fs/2);                           % Normalise the frequency values
Ws=Ws/(fs/2);                           % Normalise the frequency values

if ftype==1
   [N,Wn]=buttord(Wp,Ws,Rp,Rs);
   [Z,P,K]=butter(N,Wn,res);
end

if ftype==2
   [N,Wn]=cheb1ord(Wp,Ws,Rp,Rs);
   [Z,P,K]=cheby1(N,Rp,Wn,res);
end

if ftype==3
   [N,Wn]=cheb2ord(Wp,Ws,Rp,Rs);
   [Z,P,K]=cheby2(N,Rs,Wn,res);
end

if ftype==4
   [N,Wn]=ellipord(Wp,Ws,Rp,Rs);
   [Z,P,K]=ellip(N,Rp,Rs,Wn,res);
end

sos=zp2sos(Z,P,K);                      % Convert ZP to SOS 
ssos=sos;                               % Copy of SOS, will be used for scaling 
isos=ssos;                              % Copy of SOS, will be used for Q format Rep
nbiq=size(sos,1);                       % Number of biquads(no of rows)
dmag=zeros(1,nbiq);                     % Clear Peak manitude buffer for Delay node
ymag=zeros(1,nbiq);                     % Clear Peak manitude buffer for Output node
sf=zeros(1,nbiq);                       % Clear Scale Factor array

B=zeros(1,nbiq*3);
A=zeros(1,nbiq*3);

% Obtain the peak magnitude at various nodes in Cascaded Biquad implementation
for i=1:nbiq                            % Loop to find the peak magnitude in SOS nodes
   if i==1                              % Obtain the peak magnitue at the first delay node
      num=[1 0 0];               
      den=sos(1,4:6);
      h=impz(num,den,Ni);
      dmag(i)=sum(abs(h));
   end
   
   if i~=1                              % Obtain the peak magnitue at the delay node
      [num,den]=sos2tf(sos(1:i-1,:)); 
      den=conv(den,sos(i,4:6));
      h=impz(num,den,Ni);
      dmag(i)=sum(abs(h));
   end
   
   [num,den]=sos2tf(sos(1:i,:));        % Obtain the peak magnitue at the biquad output node
   h=impz(num,den,Ni);
   ymag(i)=sum(abs(h));
   sf(i)=max(ymag(i),dmag(i));
end

% Scale the B coeff of biquad to avoid overflow in the node

for i=2:nbiq
   scale=sf(i)/sf(i-1);
   ssos(i-1,1:3)=ssos(i-1,1:3)/scale;
end

% Scale the 'b' coeff of last BIQUAD 
ssos(nbiq,1:3)=ssos(nbiq,1:3)*sf(nbiq);

% Determine the Q format for representing the coefficients & Input Scale factor
maxcoeff=max(max(abs(ssos)));
maxval=max(maxcoeff,1/sf(1));		% Modified from max(maxcoeff, sf(1)), Settu 27/12/2001
qformat=FMAT-1;
if(maxval>1)
   qformat=(FMAT-1)-ceil(log2(maxval));
   qscale=2^qformat;
end

% Respresent the scaled second order section and ISF in appropriate number format 
isos=ssos*qscale;
isos=round(isos);

isf=(1/sf(1))*qscale;                   % Represent the input scale factor in Fixed Point format    
isf=round(isf);

% Saturate the coefficient to maximum positive value
for i=1:nbiq
    for j=1:6
        if isos(i,j)==2^(FMAT-1)
         isos(i,j)=(2^(FMAT-1))-1;
      end
   end
end

if isf==2^(FMAT-1)                      % Saturate to maximum positive value
   isf=(2^(FMAT-1))-1;
end

% Open the file and store the scaled IIR filter coefficients and Input scale factor
fid = fopen(fname,'w');

fprintf(fid,'#define IIR16_COEFF {\\');
fprintf(fid,'\n');
   for i=1:nbiq
      fprintf(fid,'\t\t\t');
      bis=isos(i,1:3);
      bis=fliplr(bis);
      ais=isos(i,5:6);
      ais=-fliplr(ais);                 % Negate the 'a' coefficients
      fprintf(fid,'%d,',ais);
      fprintf(fid,'%d,',bis);
      fprintf(fid,'\\');
        fprintf(fid,'\n');
    end
    fseek(fid,-3,0);
   fprintf(fid,'}\n');
   fprintf(fid,'\n#define IIR16_ISF\t%d\n',isf);
   fprintf(fid,'#define IIR16_NBIQ\t%d\n',nbiq);
   fprintf(fid,'#define IIR16_QFMAT\t%d\n',qformat);
fclose(fid);

% Display Q format of the IIR filter coefficients, No of biquads
disp(' ');
disp('Q format of the IIR filter coefficients:');
disp(qformat);

disp('Input Scaling value:');
disp(1/sf(1));

disp('Number of Biquads:');
disp(nbiq);

% Plot the frequency response of the filter
[B,A]=sos2tf(sos);                  
[H,f]=freqz(B,A,512,fs);
figure(1);
subplot(2,1,1);
plot(f,abs(H));
grid;
xlabel('Hertz');
ylabel('Magnitude Response');
subplot(2,1,2);
plot(f,unwrap(angle(H))*180/pi);
grid;
xlabel('Hertz');
ylabel('Phase (degrees)');
figure(2);
freqz(B,A,512,fs);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -