%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % ZZS - 6.cvičení: Číslicové filtry 2.řádu % R.Čmejla, 27.října 2014 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % skript vyžaduje soubory: banjo.wav % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% % Příklad 1: Filtry se dvěma póly – rezonátory % Navrhněme banku filtrů tvořených rezonátory. % Analyza harmonickych v čase pomoci rezonátoru %% % a) Pro navrženou banku filtrů zobrazme rozložení nul a pólů v z-rovině. clear, close all, clc figure(1) [x,fs]=wavread('banjo'); f0=392; fr=[f0 2*f0 3*f0 4*f0 5*f0 6*f0 7*f0 8*f0 9*f0]; B = 500; % sirka pasma rezonatoru R = 1-B*pi/fs; % vypocet polomer polu b0 =(1-R)*sqrt(1-2*R*cos(2*2*pi*fr/fs)+R*R);% normujici koef. a = -2*R*cos(2*pi*fr/fs); % vypocet koef. rezonatoru k = .99; for h=1:9 subplot(3,3,h), %H=freqz(b0(h),[1 a(h) R.^2]); zplane(b0(h),[1 a(h) R.^2]) end; %% % b) Pro navrženou banku filtrů zobrazme normované amplitudové % frekvenční charakteristiky. figure(2) for h=1:9 subplot(3,3,h), [Ha(:,h),w]=freqz(b0(h),[1 a(h) R.^2],[],fs); Ham(h)=max(abs(Ha(:,h))); Han(:,h)=(1/Ham(h))*freqz(b0(h),[1 a(h) R.^2]) plot(abs(Han(:,h))), axis([0 512 0 1]) end; %% % c) Zobrazme všechny propusti jako banku filtrů v jednom obrázku figure(3) plot(w,abs(Han)) %% % d) Analýza harmonických pomocí rezonátorů % Zobrazme obálky jednotlivých harmonických signálu na výstupu % banky filtrů vytvořené pomocí rezonátorů. figure(4) % Sledujme vliv umístění pólu integrátoru na výsledný tvar obálky. for h=1:9 y(:,h)=(1/Ham(h))*filter(b0(h),[1 a(h) R.^2],x); % obalky jednotlivych harmonickych y(:,h)=filter((1-k),[1 -k],abs(y(:,h))); end; subplot(311), plot(x) subplot(312), specgram(x,[],fs) subplot(313), plot(y); legend('h1','h2','h3','h4','h5','h6','h7','h8','h9') %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% % Příklad 2: Filtrační syntézy %% % a) výstřel x1=randn(1,doba*fs); X=[0 .12 1]; Y=[1 0.07 0]; r=0.6; f0=1200; % rozlozeni nul a polu = ? % frekvencni charakteristika = ? % obalka = ? % syntetický prubeh = ? %% % b) činel fs = 44100; % vzorkovaci frekvence [Hz] doba = .5; % doba trvani tonu [s] x=2*rand(1,fs*doba)-1; % generovani bileho sumu O=exp(-nT./.15); B = 300; % sirka pasma rezonatoru fr = 11000; % rozlozeni nul a polu = ? % frekvencni charakteristika = ? % obalka = ? % prubeh = ? %% % c) hodiny fs = 8000; % vzorkovaci frekvence [Hz] doba = .5; % doba trvani tonu [s] x=2*rand(1,fs*doba)-1; % generovani bileho sumu fr=[3500 5500]; B = 550; % sirka pasma prvnich dvou rezonatoru fr=[3000 7000]; B = 750; % sirka pasma druhych dvou rezonatoru %% % d) rotační stroje (vlak, letadlo) fs=22050; f1=25; % parni lokomotiva f1=5 Hz % letadlo f1=65 Hz doba=4; nT=0:1/fs:doba-1/fs; % casova osa x1=sawtooth(2*pi*f1*[0:1/fs:doba-1/fs]); % pasmove omezit x2=randn(1,length(x1)); X=[0 .25 .5 .6 1]; Y=[0 .75 1 .45 0]; r=0.3; f0=1950; x=filter(1,[1 -2*r*cos(2*pi*f0/fs) r.^2],x1); O=interp1(X,Y,nT/nT(end)); y=x1.*x2; soundsc(y.*O,fs) subplot(211), plot(y.*O) subplot(212), specgram(y.*O) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% % Příklad 3: Filtrační syntézy s časově proměnnými filtry % a) vítr % Vítr můžeme modelovat průchodem bílého šumu rezonátorem s proměnnou % rezonační frekvencí a konstantní šířkou pásma. % Pro silný vítr použijeme kratších časových úseků o délce 0,2 až % 0,5 sekund a rezonanční frekvenci 800 až 900 Hz. % Slabší vítr se modeluje delšími časovými úseky 2 až 3 sekundy % a rezonanční frekvencí od 100 do 200 Hz. clear, fs = 8000; % vzorkovaci frekvence [Hz] doba = 10; % doba trvani tonu [s] x=2*rand(1,fs*doba)-1; % generovani bileho sumu nT=0:1/fs:doba-1/fs; % casova osa % souradnice ridicich bodu sily vetru X=[0 .15 .3 .4 .5 .65 .7 .75 .8 .85 .9 .95 1]; Y=[0 .2 .1 .3 .05 .3 1 .8 1 .5 1 .7 .1]; Fmin=100; Fmax=900; y=(Fmax-Fmin)*Y+Fmin; %% % b) vlny % Vlny, podobně jako vítr, můžeme modelovat průchodem bílého šumu % rezonátorem. V tomto případě však kromě rozonanční frekvence měníme % amplitudu průběhu a šířku pásma. Změnou šířky pásma řídíme „velikost“ vlny. clear fs = 8000; % vzorkovaci frekvence [Hz] doba = 5; % doba trvani tonu [s] x=2*rand(1,fs*doba)-1; % generovani bileho sumu nT=0:1/fs:doba-1/fs; % casova osa % souradnice ridicich bodu X =[0 .2 .25 .35 1]; % casova osa Y_A=[0.15 .8 .15 .8 0.15]; % amplituda Y_B=[0 320 400 600 4000]; % sirka pasma Y_f=[80 80 1000 1000 1000]; % rezonancni frekvence % casovy prubeh interpolovane ridici amplitudy G=interp1(X,Y_A,nT/nT(end)); % casovy prubeh interpolovane sirky pasma B=interp1(X,Y_B,nT/nT(end)); % casovy prubeh interpolovane ridici rezonancni frekvence fr=interp1(X,Y_f,nT/nT(end)); %% % c) voda %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% % Příklad 4: Formantová syntéza řeči % Kaskádí syntéza samohlásek (buzení impulsem a šumem) % ---------------------------------------------------------- % | V | F1 | F2 | F3 | F4 | BW1 | BW2 | BW3 | BW4 | % ---------------------------------------------------------- % | A | 700 | 1100 | 2700 | 3500 | 90 | 110 | 170 | 250 | % | E | 400 | 1750 | 2500 | 3400 | 90 | 110 | 170 | 250 | % | I | 250 | 2000 | 2900 | 3300 | 90 | 110 | 170 | 250 | % | O | 500 | 700 | 2700 | 3800 | 90 | 110 | 170 | 250 | % | U | 300 | 500 | 2550 | 3350 | 90 | 110 | 170 | 250 | % ---------------------------------------------------------- clear, clc % parametry syntetického signálu fs=16000; % vzorkovaci frekvence doba=.6; % delka samohlasky % generování základního hlasivkového tónu f0=90; % zakladni frekvence B0=100; R0=1-B0*pi/fs; % filtr hlasoveho ustroji % Fg=1500; Bg=6000; Rg=1-Bg*pi/fs; Fg=1500; Bg=3500; Rg=1-Bg*pi/fs; [b0,a0]=zp2tf([Rg*exp(j*2*pi*Fg/fs);Rg*exp(-j*2*pi*Fg/fs);1],[R0;R0],1); N = fix(fs/(2*f0)); % buzeni pasmove omez.impulsy x=[ones(1,N)*cos(2*pi*[1:N]'*f0*[0:1/fs:doba-1/fs])]; pulsy=filter(b0,a0,x); noise=randn(1,length(x)); % buzeni sumem % definice formantových kmitočtů samohlásek A = [700 1100 2700 3500]; % [F1 F2 F3 F4] E = [400 1750 2500 3400]; % [F1 F2 F3 F4] I = [250 2000 2900 3300]; % [F1 F2 F3 F4] O = [500 700 2700 3800]; % [F1 F2 F3 F4] U = [300 550 2550 3350]; % [F1 F2 F3 F4] B = [ 90 110 170 250]; % [B1 B2 B3 B4] % výběr samohlásky F = A; % F = A/E/I/O/U % volba buzení na vstupu % y = noise; % y = pulsy/noise y = pulsy; subplot(311), plot(y) % výpočet koeficientů formantovych filtru for k=1:4 R(k)=1-B(k)*pi/fs; pp(k)=R(k)*exp(j*2*pi*F(k)/fs); pn(k)=R(k)*exp(-j*2*pi*F(k)/fs); [b(k,:),a(k,:)]=zp2tf(0,[pp(k);pn(k)],1); end; % kaskadní spojení filtrů for k=1:4 y=filter(b(k,:),a(k,:),y); end; soundsc(y,fs) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% % Příklad 5: Formantové syntézy hudebních nástrojů % a) housle %% % b) cello %% % c) klarinet %% % ----------------------------------------------------------- %% % Formantová syntéza zvuku nástroje % 1. analyza nástroje --> výběr vhodného typu budícího signálu, % frekvence a obálky % 2. synteza nástroje (s použitím rezonančních frekvencí % a šířek pásma podle tabulky) % ------------------------------------------------------------------ % | nástroj | F1 | F2 | F3 | F4 | BW1 | BW2 | BW3 | BW4 | % ------------------------------------------------------------------- % | housle | 500 | 1500 | 3000 | 4000 | 300 | 200 | 700 | 1500 | % | cello | 990 | 2000 | | | 450 | 560 | | | % | tuba | 350 | 3960 | | | 225 | 1800 | | | % | fagot | 440 | 1180 | 3320 | | 110 | 675 | 1125 | | % | trubka | 800 | 1750 | 2800 | 3300 | 795 | 795 | 795 | 795 | % | saxofon | 680 | 2050 | 4600 | | 900 | 700 | 700 | | % | hoboj | 1350 | 3450 | | | 337 | 450 | | | % | lesní roh | 550 | 2100 | 790 | | 450 | 790 | 1600 | | % | flétna | 750 | 1600 | 4830 | | 560 | 225 | 800 | | % | klarinet | 300 | 830 | 2190 | 3880 | 450 | 450 | 900 | 675 | % ------------------------------------------------------------------ %