Základy zpracování signálu Jiří Krejsa, Generování signálu v Matlabu Jak získám signál? - měření Jak vyrobit signál v Matlabu? Řada funkcí, základní jsou v klasickém Matlabu, další v SPT (Signal Processing Toolbox). Deterministické signály Klasické harmonické - funkce sin a cos t = :.:; = ; skutecna_frekvence = ; uhlova_frekvence = *pi*skutecna_frekvence; uhlova_faze = ; x = *sin(uhlova_frekvence*t + uhlova_faze); plot(t,x) xlabel(''); ylabel('');.5.5 -.5 - -.5 -...3.4.5.6.7.8.9 sin / cos jsou v základním matlabu, na všechno další je již nutný SPT - Signal Processing Toolbox
Základy zpracování signálu Jiří Krejsa, Harmonický signál s proměnným kmitočtem - příkaz chirp koncovy_cas = ; t = :.:koncovy_cas; = ; pocatecni_frekvence = ; koncova_frekvence = ; x = *chirp(t,pocatecni_frekvence,koncovy_cas,koncova_frekvence); plot(t,x) xlabel(''); ylabel(''); v čem je to jiné?.5.5 -.5 - -.5 -...3.4.5.6.7.8.9 koncovy_cas = ; t = :.:koncovy_cas; = ; pocatecni_frekvence = ; koncova_frekvence = ; x = *chirp(t,pocatecni_frekvence,koncovy_cas,koncova_frekvence); plot(t,x) xlabel(''); ylabel('');.5.5 -.5 - -.5 -...3.4.5.6.7.8.9
Základy zpracování signálu Jiří Krejsa, rozšířená verze (metoda, fáze) - fáze nefachá! koncovy_cas = ; t = :.:koncovy_cas; = ; pocatecni_frekvence = ; koncova_frekvence = ; pocatecni_faze = pi/8; x = *chirp(t,pocatecni_frekvence,koncovy_cas,koncova_frekvence,'quadratic',pocatecni_faze); plot(t,x) xlabel(''); ylabel(''); další změny kmitočtu: linear, quadratic, logarithmic.5.5 -.5 - -.5 -...3.4.5.6.7.8.9
Základy zpracování signálu Jiří Krejsa, Harmonický oscilátor s frekvencí závislou na vektorové veličině - příkaz vco (voltage controlled oscillator) = ; Fs = ; % vzorkovaci frekvence t = :/Fs:; % cas v rozsahu - sec Fc = Fs/; % referencni frekvence ridici_signal = zeros(,length(t)); % rozsah hodnot je - az, - odpovida nulove frekvenci odpovida Fc, % odpovida *Fc prvniinterval = floor(length(t)/3); ridici_signal(:prvniinterval) = -.5; ridici_signal(*prvniinterval:length(t)) =.5; x = *vco(ridici_signal,fc,fs); subplot(,,) plot(t,ridici_signal); xlabel(''); ylabel('ridici signal'); subplot(,,) plot(t,x) xlabel(''); ylabel(''); ridici signal.5 -.5..4.6.8..4.6.8 - -..4.6.8..4.6.8 Co když bude řídící signál harmonický? Nebo lineární?
Základy zpracování signálu Jiří Krejsa, = ; Fs = ; % vzorkovaci frekvence t = :/Fs:; % cas v rozsahu - sec Fc = Fs/; % referencni frekvence ridici_signal = sin(5*t); x = *vco(ridici_signal,fc,fs); subplot(,,) plot(t,ridici_signal); xlabel(''); ylabel('ridici signal'); subplot(,,) plot(t,x) xlabel(''); ylabel(''); = ; Fs = ; % vzorkovaci frekvence t = :/Fs:; % cas v rozsahu - sec Fc = Fs/; % referencni frekvence ridici_signal = linspace(-,, length(t)); x = *vco(ridici_signal,fc,fs); subplot(,,) plot(t,ridici_signal); xlabel(''); ylabel('ridici signal'); subplot(,,) plot(t,x) xlabel(''); ylabel(''); ridici signal ridici signal.5 -.5 -..4.6.8..4.6.8 - -..4.6.8..4.6.8.5 -.5 -..4.6.8..4.6.8 - -..4.6.8..4.6.8
Základy zpracování signálu Jiří Krejsa, Obdélník a pila - příkazy square a sawtooth square - Příkaz umožňuje vytvářet sled impulzů o obdélníkovém průběhu, defaultně je stejně dlouhý v kladné i záporné oblasti, změnit to jde parametrem (v procentech) =.; frekvence_signalu = ; %Hz t = :.:.5; % cas v rozsahu -.5 sec x = * square(*pi*frekvence_signalu*t); plot(t,x) xlabel(''); ylabel('');.5.5 -.5 - -.5.5..5..5.3.35.4.45.5 =.; frekvence_signalu = ; %Hz t = :.:.5; % cas v rozsahu -.5 sec x = * square(*pi*frekvence_signalu*t,5); % 5 procent je delka kladne plot(t,x) xlabel(''); ylabel('');.5.5 -.5 - -.5.5..5..5.3.35.4.45.5
Základy zpracování signálu Jiří Krejsa, sawtooth - Příkaz umožňuje vytvářet sled impulzů o pilovitém průběhu, tvar pily se dá měnit parametrem =.; frekvence_signalu = ; %Hz t = :.:.75; % cas v rozsahu -.75 sec parametr = ; x = * sawtooth(*pi*frekvence_signalu*t,parametr); parametr =.; x = * sawtooth(*pi*frekvence_signalu*t,parametr); parametr =.5; x3 = * sawtooth(*pi*frekvence_signalu*t,parametr); parametr = ; x4 = * sawtooth(*pi*frekvence_signalu*t,parametr); subplot(,,) plot(t,x) xlabel(''); ylabel(''); title('parametr ') subplot(,,) plot(t,x) xlabel(''); ylabel(''); title('parametr.') subplot(,,3) plot(t,x3) xlabel(''); ylabel(''); title('parametr.5') subplot(,,4) plot(t,x4) xlabel(''); ylabel(''); title('parametr ') - parametr -..4.6.8 parametr.5 - -..4.6.8 - parametr. -..4.6.8 parametr - -..4.6.8
Základy zpracování signálu Jiří Krejsa, Jediný impuls o různých průbězích vyrábí příkazy rectpuls, tripuls a gauspuls. Impulsy jsou centrované kolem nuly a délka je na intervalu otevřeném zprava (na to pozor!) =.; t = -4:.:4; % cas v rozsahu -5 5 sec x = * rectpuls(t); x = * rectpuls(t,3); x3 = * tripuls(t,3,-); x4 = * tripuls(t,,); subplot(,,) plot(t,x) xlabel(''); ylabel(''); title('rectpuls') subplot(,,) plot(t,x) xlabel(''); ylabel(''); title('rectpuls(t,3)') subplot(,,3) plot(t,x3) xlabel(''); ylabel(''); title('tripuls(t,3,-)') subplot(,,4) plot(t,x4) xlabel(''); ylabel(''); title('tripuls(t,,)').4..8.6.4. rectpuls -4-4.5.5 tripuls(t,3,-) -4-4.4..8.6.4. rectpuls(t,3) -4-4.5.5 tripuls(t,,) -4-4
Základy zpracování signálu Jiří Krejsa, gauspuls vyrábí harmonický signál, jehož tvar () se mění podle Gaussovky. Má více parametrů: gauspuls(t,fc,bw), kde t je čas, fc je frekvence harmonického signálu a bw je šířka pásma (bw = band width). Šířka pásma je ve zlomku (má rozsah - ). =.; frekvence = ; sirka_pasma =..5 sirka pasma..5 sirka pasma.5 t = -:.:; % cas v rozsahu - sec x = * gauspuls(t, frekvence, sirka_pasma); sirka_pasma =.5; x = * gauspuls(t, frekvence, sirka_pasma);.5.5 subplot(,,) plot(t,x) xlabel(''); ylabel(''); title('sirka pasma.') -.5 -.5 subplot(,,) plot(t,x) xlabel(''); ylabel(''); title('sirka pasma.5') - - -.5 - -.5.5 -.5 - -.5.5 Poznámka: tenhle způsob modulace signálu máte každý u sebe (GSM)
Základy zpracování signálu Jiří Krejsa, Někdy je fajn zjistit, kdy už bude mrnění signálu příliš malé. tc = gauspuls('cutoff',fc,bw,bwr,tpe) kde: o tc je doba (cutoff time), po které obálka opisující generovaný impuls klesne o tpe (ten poslední parametr ve funkci) decibelů vůči maximu obálky. o bwr je referenční úroveň šířky pásma tpe i bwr musí být menší než nula! =.; frekvence = 5; % 5kHz vzorkovani = ; % MHz vz_per = /vzorkovani; % vzorkovaci perioda sirka_pasma =.6; % 6 % limit = -4; % az bude signal o -4dB mensi nez spicka % zjistim dobu (v sekundach) tc = gauspuls('cutoff',frekvence,sirka_pasma,[],limit) % cas si nastavim jen odtud potud t = -tc : vz_per : tc; x = * gauspuls(t,frekvence,sirka_pasma); % jeste jednou totez pro krutejsi limit sirka_pasma =.6; % 6 % limit = -9; % az bude signal o -9dB mensi nez spicka tc = gauspuls('cutoff',frekvence,sirka_pasma,[],limit) t = -tc : vz_per : tc; x = * gauspuls(t,frekvence,sirka_pasma); subplot(,,); plot(t,x) xlabel(''); ylabel(''); title('limit -4dB') subplot(,,); plot(t,x) xlabel(''); ylabel(''); title('limit -6dB') limit -4dB.5.5 -.5 - -4-3 - - 3 4 limit -6dB x -5.5.5 -.5 - -6-4 - 4 6 x -5
Základy zpracování signálu Jiří Krejsa, K čemu jsou dobré jednotlivé pulsy? Dá se z nich sestavit celý signál (pulse train) pomocí funkce pulstran: y = pulstran(t,d,'func'), kde t je vektor časové osy d určuje kolikrát se budou impulsy opakovat func označuje typ signálu, konkrétně 'gauspuls' pro generování gaussovsky modulovaného harmonického signálu 'rectpuls' pro obdélníkový signál 'tripuls' pro pilovitý signál =.; frekvence = 5; % 5Hz vzorkovani = ; % khz t = :/vzorkovani:; d = :/frekvence:; sirka_obdelniku = *(/vzorkovani); % desetinasobek periody vzorkovani y = *pulstran(t,d, 'rectpuls',sirka_obdelniku);.5.5 rectpuls sirka_pily = (/frekvence)/3; % tretina frekvence pulsu tvar_pily = -; y = *pulstran(t,d, 'tripuls',sirka_pily,tvar_pily); subplot(,,); plot(t,y) xlabel(''); ylabel(''); title('rectpuls') subplot(,,); plot(t,y) xlabel(''); ylabel(''); title('tripuls')...3.4.5.6.7.8.9 tripuls.5.5...3.4.5.6.7.8.9
Základy zpracování signálu Jiří Krejsa, Parametr d může být dvousloupcová matice. V tom případě je první sloupec frekvence impulsů a druhý sloupec je váha (gain). Příklad s váhou o průběhu půlky sinusovky: =.; frekvence = ; % 5Hz vzorkovani = ; % khz t = :/vzorkovani:; d = :/frekvence:; % odstupy d = sin(*pi*d); % gain d= [d' d'] sirka_obdelniku = *(/vzorkovani); % desetinasobek periody vzorkovani y = *pulstran(t,d, 'rectpuls',sirka_obdelniku); sirka_pily = (/frekvence)/3; % tretina frekvence pulsu tvar_pily = -; y = *pulstran(t,d, 'tripuls',sirka_pily,tvar_pily); - rectpuls -...3.4.5.6.7.8.9 tripuls - -...3.4.5.6.7.8.9
Základy zpracování signálu Jiří Krejsa, Jako pulsu se dá použít i nějaký vlastní tvar, přičemž se použije interpolace z tohoto tvaru: pulstran(t, d, muj_puls, vzorkovani_meho_pulsu) přičemž muj_puls pokrývá [,(length(muj_puls)-)/ vzorkovani_meho_pulsu] a mimo rozsah se bere roven nule. =.; frekvence = ; % Hz vzorkovani = ; % Hz muj_puls = hamming(5); % moj vlastni prubeh pulsu t = :/vzorkovani:; d = :/frekvence:; % odstupy y = *pulstran(t,d,muj_puls,4); subplot(,,); plot(muj_puls) xlabel('vzorek'); ylabel('hodnota'); title('muj puls') subplot(,,); plot(t,y) xlabel(''); ylabel(''); title('sled mych vlastnich pulsu') hodnota.8.6.4. muj puls 5 5 5 vzorek sled mych vlastnich pulsu.5.5 -.5...3.4.5.6.7.8.9
Základy zpracování signálu Jiří Krejsa,. Modulované signály Modulace - změna charakteru vhodného nosného signálu pomocí modulujícího (řídícího)signálu Způsoby modulace: moc moc moc, ukážeme ty základní, je nutný SPT Příkaz modulate Syntaxe: modulate(x, fc, fs, metoda, argumenty) x - řídící signál fc - frekvence nosné fs - vzorkovací frekvence metoda - string, je jich spousta argumenty - většina metod umožňuje rozsáhlou parametrizaci základní modulace: PPM - pulzně polohová modulace (pulse position modulation) PWM - pulzně šířková modulace (pulse width modulation) AM - amplitudová modulace FM - frekvenční modulace
Základy zpracování signálu Jiří Krejsa, PPM - pulzně polohová modulace frekvence = 4; % Hz vzorkovani = ; % Hz % ridici signal musi byt v rozmezi -, ale pozor na prekryti pulsu!.5 ridici signal ridici_signal = [ ]; ridici_signal = [.5.5.5.9.9.9]; sirka_pulsu =.; % modulate umi i vratit casovou osu, staci pridat parametr na vystup [y,t] = modulate(ridici_signal,frekvence,vzorkovani,'ppm',sirka_pulsu); [y,t] = modulate(ridici_signal,frekvence,vzorkovani,'ppm',sirka_pulsu); subplot(4,,); stem(ridici_signal) title('ridici signal ') subplot(4,,); stem(t,y) xlabel('cas [sec]'); title('modulovany signal ') -.5-3 4 5 6 7 8 9.5 modulovany signal.5..5..5 cas [sec] ridici signal.5 3 4 5 6 7 8 9 subplot(4,,3); stem(ridici_signal) title('ridici signal ') modulovany signal subplot(4,,4); stem(t,y) xlabel('cas [sec]'); title('modulovany signal ').5.5..5..5 cas [sec]
Základy zpracování signálu Jiří Krejsa, PWM - pulsně šířková modulace frekvence = 4; % Hz frekvence = 8; vzorkovani = ; % Hz ridici_signal = [..5..5.9.7.9];.5 ridici signal % modulate umi i vratit casovou osu, staci pridat parametr na vystup [y,t] = modulate(ridici_signal,frekvence,vzorkovani,'pwm'); [y,t] = modulate(ridici_signal,frekvence,vzorkovani,'pwm'); subplot(3,,); stem(ridici_signal) title('ridici signal ') subplot(3,,); stem(t,y) xlabel('cas [sec]'); title('modulovany signal - frekvence 4 Hz') subplot(3,,3); stem(t,y) xlabel('cas [sec]'); title('modulovany signal - frekvence 8 Hz') 3 4 5 6 7 8 9.5 modulovany signal - frekvence 4 Hz.5..5..5 cas [sec] modulovany signal - frekvence 8 Hz.5..4.6.8.. cas [sec]
Základy zpracování signálu Jiří Krejsa, Amplitudová modulace frekvence = ; % Hz frekvence = ; % Hz vzorkovani = ; % Hz.5 ridici signal t = :/vzorkovani:; ridici_signal = cos(*pi*t); hodnota -.5 y = modulate(ridici_signal,frekvence,vzorkovani,'am'); y = modulate(ridici_signal,frekvence,vzorkovani,'am'); subplot(3,,); plot(t,ridici_signal) xlabel('cas [sec]'); ylabel('hodnota'); title('ridici signal') subplot(3,,); plot(t,y) xlabel(''); ylabel(''); title('modulovany signal ( Hz)') subplot(3,,3); plot(t,y) xlabel(''); ylabel(''); title('modulovany signal ( Hz)') -..4.6.8..4.6.8 cas [sec] modulovany signal ( Hz).5 -.5 -..4.6.8..4.6.8 modulovany signal ( Hz).5 -.5 -..4.6.8..4.6.8
Základy zpracování signálu Jiří Krejsa, Frekvenční modulace frekvence = ; % Hz frekvence = ; % Hz vzorkovani = ; % Hz t = :/vzorkovani:; hodnota.5 -.5 ridici signal ridici_signal = cos(*pi*t); y = modulate(ridici_signal,frekvence,vzorkovani,'fm'); y = modulate(ridici_signal,frekvence,vzorkovani,'fm'); poznámka - není problém využít již probraného příkazu vco a dosáhnout téhož výsledku, vyzkoušejte -..4.6.8..4.6.8 cas [sec] modulovany signal ( Hz).5 -.5 -..4.6.8..4.6.8 modulovany signal ( Hz).5 -.5 -..4.6.8..4.6.8
Základy zpracování signálu Jiří Krejsa, Jak z toho zase dostanu zpátky původní signál, když mám k dispozici ten modulovaný? Příkaz demod frekvence = ; % Hz vzorkovani = ; % Hz t = :/vzorkovani:; ridici_signal = sin(*pi*t); y = modulate(ridici_signal,frekvence,vzorkovani,'am'); y = demod(y,frekvence,vzorkovani,'am'); subplot(,,); plot(t,ridici_signal,'r',t,y,'b') xlabel('cas [sec]'); ylabel('hodnota'); title('ridici signal pred a po demodulaci') legend('pred','po'); subplot(,,); plot(t,y) xlabel(''); ylabel(''); title('modulovany signal') hodnota.5 -.5 ridici signal pred a po demodulaci pred -...3.4.5.6.7.8.9 cas [sec] modulovany signal.5 -.5 -...3.4.5.6.7.8.9 po Není to nějaké podivné? Vždyť po demodulaci je to přesně půlka původního signálu! Jak to? Demod to dělá blbě!
Základy zpracování signálu Jiří Krejsa, Generování zašumělých signálů Aditivní šum - šum je se signálem sečtený xn [ ] = sn [ ] + sumn [ ] Jak vyrobit signál, který je zašumělý aditivním šumem o stanoveném poměru SNR (signal to noise ratio)? SNR db Psignál Asignál Asignál = log = log = log Pšum Ašum Ašum Potřebuji tedy vypočítat efektivní hodnoty signálu a šumu. Když má šum nulovou střední hodnotu, je jeho efektivní hodnota rovna směrodatné odchylce. Tuto směrodatnou odchylku potřebuji určit: A σ = signál SNR N Připomínám, že výkon signálu je suma čtverců podělená počtem vzorků: P s [ n] = N A efektivní hodnota je druhá odmocnina z výkonu (pro harmonický signál je to / ). n=
Základy zpracování signálu Jiří Krejsa, Příklad - chceme vyrobit sinusovku o amplitudě, která bude zatížena aditivním šumem tak, že SNR je a db. = ; vzorkovani = ; %Hz frekvence = ; %Hz % casova osa t = :/vzorkovani:; % - sec % cisty signal signal = * sin(*pi*frekvence*t); 3 - - signal s aditivnim sumem o SNR = db % vypocet sumu SNR = ; %db A = / sqrt(); sigma = A / (^(SNR/)); sum = sigma * randn(,length(t)); %pozor na rand/randn! -3-4..4.6.8..4.6.8 SNR = ; %db sigma = A / (^(SNR/)); sum = sigma * randn(,length(t)); %celkovy signal signal_sesumem = signal + sum - sigma/; signal_sesumem = signal + sum - sigma/; subplot(,,) plot(t,signal_sesumem,'b',t,signal,'r') title('signal s aditivnim sumem o SNR = db'); subplot(,,) plot(t,signal_sesumem,'b',t,signal,'r') title('signal s aditivnim sumem o SNR = db'); 3 - - signal s aditivnim sumem o SNR = db -3..4.6.8..4.6.8
Základy zpracování signálu Jiří Krejsa, Příklad toho, co se stane s nebohým zvukem, když ho zašumíme. Na webu sosněte zvuk rec.wav, nebo namluvte vlastní. % nasosnuti zvuku, jeho zasumeni clear all [vzorky,fs,nbits]=wavread('rec.wav');..5 original se sumem % zasumime SNR = ; %db = (max(vzorky) - min(vzorky))/; A = / sqrt(); sigma = A / (^(SNR/)); sum = sigma * randn(,length(vzorky)); sum = sum'; vzorky = vzorky + sum - sigma/; % ulozime wavwrite(vzorky,fs,nbits,'recsum.wav'); % zobrazime od = 4; do = od+5; plot(:do-od+, vzorky(od:do),'b',:do-od+,vzorky(od:do),'r'); legend('original','se sumem')..5 -.5 -. -.5 -. 3 4 5 6
Základy zpracování signálu Jiří Krejsa, Šum se přidá spíše při přenosu signálu. Takže nejprve modulujeme, pak zašumíme, demodulujeme a koukáme % nasosnuti zvuku, jeho modulace, zasumeni a nasledna demodulace clear all [vzorky,fs,nbits]=wavread('rec.wav');.8 % zmodulujeme AM, nosna bude dvojnasobek vzorkovacky originalnich dat frekvence = fs * ; vzorkovani = frekvence * ; radio = modulate(vzorky,frekvence,vzorkovani,'am');.6.4 % zasumime modulovany signal SNR = ; %db = (max(radio) - min(radio))/; A = / sqrt(); sigma = A / (^(SNR/)); sum = sigma * randn(,length(radio)); sum = sum'; radio = radio + sum - sigma/; % domodulujeme vzorky = demod(radio,frekvence,vzorkovani,'am'); vzorky = vzorky * ; % % ulozime wavwrite(vzorky,fs,nbits,'recsummod.wav');. -. -.4 -.6 original po modulaci modulece se sumem demodulovany -.8 4 6 8 % zobrazime od = 4; do = od+; plot(:do-od+, vzorky(od:do),'b',:do-od+,radio(od:do),'r',:dood+,radio(od:do),'k',... :do-od+,vzorky(od:do),'m'); legend('original','po modulaci','modulece se sumem','demodulovany')