- % Wprowadzenie do filtracji cyfrowej - filtry rekurencyjne
- % filtry o nieskończonej odpowiedzi impulsowej
- clear all; close all;
- % Sygnał #################################################################
- if(0)
- Nx = 1000; fpr1=8000;
- x = zeros(1,Nx);
- x(1) = 1;
- end
- if(0)
- fpr1 = 8000;
- Nx = 3*fpr1;
- dt = 1/fpr1; t=dt*(0:Nx-1);
- x = sin( 2*pi*200*t) + sin( 2*pi*2000*t);
- end
- if(1)
- [ x, fpr1 ] = audioread('mowa.wav');
- % [ x, fpr1 ] = audioread('track1.wav');
- disp('Rozmiar audio'); size(x),
- x = x(:,1);
- Nx = length(x);
- pause
- end
- %figure; plot(x); pause
- figure; stem(x); pause
- figure;
- f = fpr1/Nx * [ -Nx/2 : Nx/2-1 ];
- %plot( f,20*log10( fftshift(abs(fft(x)/Nx)) )); pause
- soundsc( x, fpr1 );
- % Wagi filtra #############################################################
- %b = [ 2 3 4 ];
- %a = [ 1 2 ];
- if(0)
- z = [ 1 1 ] .* exp( j*2*pi*[ 2000 3000 ]/fpr1 );
- p = [ 0.99 0.99 ] .* exp( j*2*pi*[ 100 200 ]/fpr1 );
- z = [ z conj(z) ];
- p = [ p conj(p) ];
- b = poly( z );
- a = poly( p );
- end
- if(1)
- N = 8;
- f0 = 1000;
- pasmo = [1000 2000]
- [b,a] = butter( N, pasmo/(fpr1/2) );
- [b1,a1] = cheby1( N, 3, pasmo/(fpr1/2) );
- [b2,a2] = cheby2( N, 100, pasmo/(fpr1/2) );
- [b3,a3] = ellip( N, 3, 100, pasmo/(fpr1/2) );
- z = roots( b );
- p = roots( a );
- z1 = roots( b1 );
- p1 = roots( a1 );
- z2 = roots( b2 );
- p2 = roots( a2 );
- z3 = roots( b3 );
- p3 = roots( a3 );
- end
- figure;
- alfa = 0 : 0.01 : 2*pi; c=cos(alfa); s=sin(alfa);
- %plot(c,s,'k-',real(z),imag(z),'bo',real(p),imag(p),'r*'); grid; title('Z & P'); pause
- f = 0 : 1 : fpr1/2;
- zz = exp( -j*2*pi*f/fpr1);
- H = polyval( b, zz ) ./polyval( a, zz );
- figure;
- plot( f, 20*log10( abs( H ) ),'r' ); hold on;
- H1 = polyval( b1, zz ) ./polyval( a1, zz );
- plot( f, 20*log10( abs( H1 ) ),'g' ); hold on;
- H2 = polyval( b2, zz ) ./polyval( a2, zz );
- plot( f, 20*log10( abs( H2 ) ),'b' ); hold on;
- H3 = polyval( b3, zz ) ./polyval( a3, zz );
- plot( f, 20*log10( abs( H3 ) ),'y' ); xlabel('f [Hz]'); title('|H(f)| [dB]'); grid;
- legend('butter','cheby1','cheby2','ellip'); hold on; pause
- figure;
- bode(a,b,'r'); hold on;
- bode(a1,b1,'g'); hold on;
- bode(a2,b2,'b'); hold on;
- bode(a3,b3,'y');
- grid; legend('butter','cheby1','cheby2','ellip'); hold on; pause
- figure;
- plot(f,unwrap(angle(H)),'r'); hold on;
- plot(f,unwrap(angle(H1)),'g'); hold on;
- plot(f,unwrap(angle(H2)),'b'); hold on;
- plot(f,unwrap(angle(H3)),'y'); hold on;
- xlabel('[Hz]'),ylabel('[rad/s]')
- grid; legend('butter','cheby1','cheby2','ellip'); hold on; pause
- % Filtracja ###############################################################
- if(1)
- M = length(b);
- bx = zeros(1,M);
- N = length(a);
- a = a(2:N);
- N = N-1;
- by = zeros(1,N);
- M1 = length(b1);
- bx1 = zeros(1,M1);
- N1 = length(a1);
- a1 = a1(2:N1);
- N1 = N1-1;
- by1 = zeros(1,N1);
- M2 = length(b2);
- bx2 = zeros(1,M2);
- N2 = length(a2);
- a2 = a2(2:N2);
- N2 = N2-1;
- by2 = zeros(1,N2);
- M3 = length(b3);
- bx3 = zeros(1,M3);
- N3 = length(a3);
- a3 = a3(2:N3);
- N3 = N3-1;
- by3 = zeros(1,N3);
- for n = 1 : Nx
- bx = [ x(n) bx(1:M-1) ];
- y(n) = sum( bx .* b ) - sum( by .* a );
- by = [ y(n) by(1:N-1) ];
- bx1 = [ x(n) bx1(1:M1-1) ];
- y1(n) = sum( bx1 .* b1 ) - sum( by1 .* a1 );
- by1 = [ y1(n) by1(1:N1-1) ];
- bx2 = [ x(n) bx2(1:M2-1) ];
- y2(n) = sum( bx2 .* b2 ) - sum( by2 .* a2 );
- by2 = [ y2(n) by2(1:N2-1) ];
- bx3 = [ x(n) bx3(1:M3-1) ];
- y3(n) = sum( bx3 .* b3 ) - sum( by3 .* a3 );
- by3 = [ y3(n) by3(1:N3-1) ];
- end
- else
- y = filter(b,a,x);
- y1 = filter(b1,a1,x);
- y2 = filter(b2,a2,x);
- y3 = filter(b3,a3,x);
- end
- figure
- subplot(211); plot(x(1:400)); title('WE');
- subplot(212);
- plot(y(1:400),'r'); hold on;
- plot(y1(1:400),'g'); hold on;
- plot(y2(1:400),'b'); hold on;
- plot(y3(1:400),'y'); hold on;
- title('WY');legend('butter','cheby1','cheby2','ellip');
- pause
- figure
- subplot(211); plot(f,20*log10(fftshift(abs(fft(x)/length(x))))); title('FFT WE');
- subplot(212); plot(f,20*log10(fftshift(abs(fft(y)/length(y))))); title('FFT WY'); pause
- soundsc( y, fpr1 );