Artur1 function [y,c]=oversave_na_zajecia(x,h,k); % [y,c]=oversave(x,h,k); % Do wyznaczania odpowiedzi filtru FIR na sygnal "x" % w oparciu o odpowiedz impulsowa filtru "h"; % Zamiast splatania stosuje sie metode 'overlap-save' % wykorzystujaca FFT, mnozenie w dziedzinie Fouriera oraz IFFT; % x - ciag wejsciowy; % h - odpowiedz impulsowa filtru; % k - ile razy blok dla FFT ma byc dluzszy od "h"; % % y - ciag wyjsciowy (o dlugosci takiej samej co ciag wejsciowy); % c - licznik operacji flops; % % UWAGA - ciag "x" jest wydluzany (zerami) tak by skladal sie z calkowitej ilosci % blokow - stad moze wynikac niezgodnosc dlugosci ciagow wyjsciowych % z przewidywana; % Jezeli nie chcemy by zera byly dodawane nalezy zapewnic, by % "x" zawieralo calkowita ilosc blokow o dlugosci: L=(k-1)*M+1; % FFT liczone jest dla ciagu o dlugosci: N=k*M; subplot(3,1,1) stem(0:length(x)-1,x) xlabel('numer próbki') ylabel('wartosc') title('sygnał x') grid on subplot(3,1,2) stem(0:length(h)-1,h) xlabel('numer próbki') ylabel('wartosc') title('transmitancja') grid on x=x(:)'; h=h(:)'; K1=length(x); M=length(h); L=(k-1)*M+1; bloki=ceil(K1/L); K = bloki*L; if K1~=K disp('UWAGA - przedluzono ciag "x" ciagiem zer'); end; x=[zeros(1,M-1) x(1:K1) zeros(1,K-K1)]; Start = M; Koniec = K-L+M; N=L+M-1; H = fft(h,N); count=0; for i=Start:L:Koniec, x1=x(i-M+1:i+L-1); flops=0; FX = fft(x1); YM = H.*FX; x1 = real(ifft(YM)); count=flops+count; y1=x1(M:M+L-1); if i==Start, y=y1; else y = [y y1]; end; end; c=count; aaa=[y,c]; subplot(3,1,3) stem(0:length(aaa)-1,aaa) xlabel('numer próbki') ylabel('wartosc') title('wynik splotu metoda oversave') grid on end ################################################################# Artur2 function aaa=overadd(x,h,k); % [y,ytail,c]=overadd(x,h,k); % Do wyznaczania odpowiedzi filtru FIR na sygnal "x" % w oparciu o odpowiedz impulsowa filtru "h"; % Zamiast splatania stosuje sie metode 'overlap-add' % wykorzystujaca FFT, mnozenie w dziedzinie Fouriera oraz IFFT; % x - ciag wejsciowy; % h - odpowiedz impulsowa filtru; % k - ile razy blok dla FFT ma byc dluzszy od "h"; % y - ciag wyjsciowy (o dlugosci takiej samej co ciag wejsciowy); % ytail - dodatkowy fragment (wyliczany tak czy siak) % dopelniajacy ciag wyjsciowy do dlugosci takiej jak po % poleceniu conv; % c - licznik operacji flops; % % UWAGA - ciag "x" jest wydluzany (zerami) tak by skladal sie z calkowitej ilosci % blokow - stad moze wynikac niezgodnosc dlugosci ciagow wyjsciowych % z przewidywana; % Jezeli nie chcemy by zera byly dodawane nalezy zapewnic, by % "x" zawieralo calkowita ilosc blokow o dlugosci: L=(k-1)*M+1; % FFT liczone jest dla ciagu o dlugosci: k*M; subplot(3,1,1) stem(0:length(x)-1,x) xlabel('numer próbki') ylabel('wartosc') title('sygnał x') grid on subplot(3,1,2) stem(0:length(h)-1,h) xlabel('numer próbki') ylabel('wartosc') title('transmitancja') grid on x=x(:)'; h=h(:)'; K1=length(x); M=length(h); L=(k-1)*M+1; bloki=ceil(K1/L); K = bloki*L; if K1~=K disp('UWAGA - przedluzono ciag "x" ciagiem zer'); end; x=[x,zeros(1,K-K1)]; Start = 1; Koniec = K-L+1; N=L+M-1; H = fft(h,N); x2 = zeros(1,M-1); count = 0; for i=Start:L:Koniec, x1=[x(i:i+L-1) zeros(1,M-1)]; flops=0; FX = fft(x1); YM = H.*FX; x1 = real(ifft(YM)); x1(1:M-1) = x1(1:M-1)+x2; count = flops+count; x2 = x1(L+1:N); y1 = x1(1:L); if i==Start, y=y1; else y = [y y1]; end end ytail=x2; c = count; aaa=[y, ytail,c]; subplot(3,1,3) stem(0:length(aaa)-1,aaa) xlabel('numer próbki') ylabel('wartosc') title('wynik splotu metoda overadd') grid on end ################################################################### link https://l.facebook.com/l.php?u=http%3A%2F%2Fwww.dsp.agh.edu.pl%2F_media%2Fpl%3Adydaktyka%3Adsp2000_7_p.pdf%3Ffbclid%3DIwAR0YsNw_wOHV3fIYY_ORYJnVk589-KVP_y9665jwYNssPpIP4l2R-SyTk5k&h=AT1oJsJ8SU6I2gDe14Zef0riz4OrA8JJggSXUUHINabeUiojJwRfeQjkQDkUpd9TBUFTGvfOuHEt2CFhpZRu5hxPh8ycP16nipXBzcMB7vflZKElwxl95sHHuEO0kYl7MPWaSA ################################################################### Stecu function [] = splotlin() clc; clear all; x = [1 1 2 3] h = [1 0 -1] L = 4; subplot (2,2,1); stem(x); stem(x,'black'); xlabel ('Numer próbki'); ylabel ('Amplituda'); title('sygnal X(n)'); subplot (2,2,2); stem(h); stem(h,'black'); xlabel ('Numer próbki'); ylabel ('Amplituda'); title('transmitancja H(n)'); M=length(h); lx=length(x); r=rem(lx,L); x1=[x zeros(1,L-r)]; nr=(length(x1))/L; h1=[h zeros(1,L-1)]; for k=1:nr Ma(k,:)=x1(((k-1)*L+1):k*L) if k==1 Ma1(k,:)=[zeros(1,M-1) Ma(k,:)]; else Ma1(k,:)=[Ma(k-1,(L-M+2):L) Ma(k,:)]; end Ma2(k,:)=ifft(fft(Ma1(k,:)).*fft(h1)); end Ma3=Ma2(:,M:(L+M-1)); y1=Ma3'; y=y1(:)' subplot (2,2,3:4); stem(y,'black'); xlabel ('Numer próbki'); ylabel ('Amplituda'); title ('probki po splocie'); end