A2B31SMS 2. PŘEDNÁŠKA - cvut.czsami.fel.cvut.cz/sms/SMS02.pdf · 2020. 4. 16. · A2B31SMS –...

Post on 27-Aug-2020

5 views 0 download

Transcript of A2B31SMS 2. PŘEDNÁŠKA - cvut.czsami.fel.cvut.cz/sms/SMS02.pdf · 2020. 4. 16. · A2B31SMS –...

A2B31SMS – 2. PŘEDNÁŠKA 9. října 2017

Číslicové signály

Aperiodické

Periodické

Aplikace

Zvuky telefonu

Hudební stupnice

Tónová volba

Tabulková (wavetable) syntéza

Tabulkový oscilátor

Interpolace

Pitch posunutí

Příklad tabulkové syntézy banja

Signály

• Signály - funkce jedné nebo více

nezávisle proměnných, které nesou

informaci o podstatě a vlastnostech svého

zdroje (nebo informaci záměrně do signálu

zakódovanou).

– Příklady signálů

– Co není signál?

Číslicové signály

• Neperiodické

• Periodické , harmonické

Exponenciální signál I

t=0:0.1:8;

a=0.8; b=-0.5;

x_t=a*exp(b*t);

btatx e)( ncanx ][

0 1 2 3 4 5 6 7 80

0.2

0.4

0.6

0.8x(t) = X eb t

t

x(t

)

0 1 2 3 4 5 6 7 8 9 100

0.2

0.4

0.6

0.8

Exponenciální signál I

doba=8; fs=10;

a=0.8; tau=2;

t=0:1/fs:doba-1/fs;

x_t=a*exp(-t/tau);

pb=10;

n=0:pb;

c=exp(-doba/(pb*tau));

x_n=a*c.^n;

% c=0.6703

btatx e)( ncanx ][

Exponenciální signál II

0 1 2 3 4 5 6 7 8 9 100

0.5

1a*cn

0 < c < 1 (c=0,67)

0 1 2 3 4 5 6 7 8 9 100

0.5

1

c = 1

0 1 2 3 4 5 6 7 8 9 100

50

100

150

c > 1 (c=1,67)

Exponenciální signál III

0 1 2 3 4 5 6 7 8 9 10-1

0

1a*cn

0 > c > -1 (c=-0,67)

0 1 2 3 4 5 6 7 8 9 10-1

0

1

c = -1

0 1 2 3 4 5 6 7 8 9 10-100

0

100

200

c < -1 (c=-1,67)

Jednotkový skok

0,0

0,1)(

t

ttu

0,0

0,1][

n

nnu

t=-2:0.01:6;

x_t = [t >= 0];

-2 -1 0 1 2 3 4 5 6

0

0.5

1

-2 -1 0 1 2 3 4 5 6

0

0.5

1

Jednotkový skok

0,0

0,1)(

t

ttu

0,0

0,1][

n

nnu

t=-2:0.01:6;

x_t = [t >= 0];

n=-2:6;

x_n = [n >= 0];

-2 -1 0 1 2 3 4 5 6

0

0.5

1

-2 -1 0 1 2 3 4 5 6

0

0.5

1

Jednotkový impulz (Dirac)

0,0

0,1][

n

nn

-5 0 5 10-0.2

0

0.2

0.4

0.6

0.8

1

n=-5:10;

x_n = [n == 0];

Obdélník

• square(om*t, delta)

– stejné jako generování sin()

– delta … % z periody, které má být kladné

>> o1_t = square(2*pi*f*t1);

>> o2_t = square(2*pi*f*t1,25);

>> o3_t = square(2*pi*f*t1,75);

0 0.002 0.004 0.006 0.008 0.01 0.012 0.014 0.016 0.018 0.02

-1

0

1 = 50%

0 0.002 0.004 0.006 0.008 0.01 0.012 0.014 0.016 0.018 0.02

-1

0

1 = 25%

0 0.002 0.004 0.006 0.008 0.01 0.012 0.014 0.016 0.018 0.02

-1

0

1 = 75%

Obdélník

• square(om*t, delta)

– stejné jako generování sin()

– delta … % z periody, které má být kladné

>> o1_t = square(2*pi*f*t1);

>> o2_t = square(2*pi*f*t1,25);

>> o3_t = square(2*pi*f*t1,75);

>> x_min =-.001; x_max =0.021;

>> y_min =-1.2; y_max =1.2;

>> axis([x_min x_max y_min y_max])

0 0.002 0.004 0.006 0.008 0.01 0.012 0.014 0.016 0.018 0.02

-1

0

1 = 50%

0 0.002 0.004 0.006 0.008 0.01 0.012 0.014 0.016 0.018 0.02

-1

0

1 = 25%

0 0.002 0.004 0.006 0.008 0.01 0.012 0.014 0.016 0.018 0.02

-1

0

1 = 75%

Pila

• sawtooth(om*t, DELTA)

– Stejné jako generování sin()

– DELTA … maximum na intervalu 0..1

>> p1_t = sawtooth(2*pi*f*t1,0);

0 0.002 0.004 0.006 0.008 0.01 0.012 0.014 0.016 0.018 0.02

-1

0

1 = 0

0 0.002 0.004 0.006 0.008 0.01 0.012 0.014 0.016 0.018 0.02

-1

0

1 = 0,5

0 0.002 0.004 0.006 0.008 0.01 0.012 0.014 0.016 0.018 0.02

-1

0

1 = 1

Pila

• sawtooth(om*t, DELTA)

– Stejné jako generování sin()

– DELTA … maximum na intervalu 0..1

>> p1_t = sawtooth(2*pi*f*t1,0);

>> p2_t = sawtooth(2*pi*f*t1,0.5);

0 0.002 0.004 0.006 0.008 0.01 0.012 0.014 0.016 0.018 0.02

-1

0

1 = 0

0 0.002 0.004 0.006 0.008 0.01 0.012 0.014 0.016 0.018 0.02

-1

0

1 = 0,5

0 0.002 0.004 0.006 0.008 0.01 0.012 0.014 0.016 0.018 0.02

-1

0

1 = 1

Pila

• sawtooth(om*t, DELTA)

– Stejné jako generování sin()

– DELTA … maximum na intervalu 0..1

>> p1_t = sawtooth(2*pi*f*t1,0);

>> p2_t = sawtooth(2*pi*f*t1,0.5);

>> p3_t = sawtooth(2*pi*f*t1,1);

0 0.002 0.004 0.006 0.008 0.01 0.012 0.014 0.016 0.018 0.02

-1

0

1 = 0

0 0.002 0.004 0.006 0.008 0.01 0.012 0.014 0.016 0.018 0.02

-1

0

1 = 0,5

0 0.002 0.004 0.006 0.008 0.01 0.012 0.014 0.016 0.018 0.02

-1

0

1 = 1

Analogově-číslicový převod

0 2 4 6 8 10 12 14 16 18 20-1

-0.8

-0.6

-0.4

-0.2

0

0.2

0.4

0.6

0.8

1

---> n

--->

x[n

]

T=1/f

Ts=1/fs

)2sin()(0

tfXtxm

frekvence [Hz]

Harmonický signál

amplituda fáze [rad]

čas [s]

)2sin()(00

tfXXtxm

Harmonický signál

? ?

?

?

)2sin()(00

tfXXtxm

Harmonický signál

0,8 1

50

0,95

Generování harmonického

signálu v MATLABu

• Generujme 20 ms harmonického signálu o

frekvenci 440 Hz a vzorkovací frekvenci 8 kHz

• Generujme 4 periody signálu o frekvenci 440

Hz a vzorkovací frekvenci 8 kHz

• Generujme 25 vzorků signálu o frekvenci 440

Hz a vzorkovací frekvenci 8 kHz

Generování harmonického

signálu v MATLABu I

• Generujme 20 ms harmonického signálu o

frekvenci 440 Hz a vzorkovací frekvenci 8 kHz

>> f=440; fs=8000; doba=.02;

>> t1 = 0:1/fs:doba-1/fs;

>> x1_t = sin(2*pi*f*t1);

>> n1 = 0:1:fs*doba-1;

>> x1_n = sin(2*pi*f*n1/fs);

0 0.002 0.004 0.006 0.008 0.01 0.012 0.014 0.016 0.018 0.02-1

-0.5

0

0.5

1

---> t [sekundy]

0 20 40 60 80 100 120 140 160-1

-0.5

0

0.5

1

---> n [vzorky]

Generování harmonického

signálu v MATLABu II

• Generujme 4 periody signálu o frekvenci 440

Hz a vzorkovací frekvenci 8 kHz

>> f=440; fs=8000; pp=4;

>> t2 = 0:1/fs:pp/f-1/fs;

>> x2_t = sin(2*pi*f*t2);

>> n2 = 0:1:pp*fs/f-1;

>> x2_n = sin(2*pi*f*n2/fs);

0 0.001 0.002 0.003 0.004 0.005 0.006 0.007 0.008 0.009 0.01-1

-0.5

0

0.5

1

---> t [sekundy]

0 10 20 30 40 50 60 70 80-1

-0.5

0

0.5

1

---> n [vzorky]

Generování harmonického

signálu v MATLABu III

• Generujme 25 vzorků signálu o frekvenci 440

Hz a vzorkovací frekvenci 8 kHz

>> f=440; fs=8000; N=25;

>> t3 = 0:1/fs:N/fs-1/fs;

>> x3_t = sin(2*pi*f*t3);

>> n3 = 0:1:N-1;

>> x3_n = sin(2*pi*f*n3/fs);

0 0.5 1 1.5 2 2.5 3

x 10-3

-1

-0.5

0

0.5

1

---> t [sekundy]

0 5 10 15 20 25-1

-0.5

0

0.5

1

---> n [vzorky]

Zvuky telefonu

% a) Oznamovací tón: F = [425 0 425 0 ]; [Hz]

% T = [0.33 0.33 0.66 0.66 ]; [s]

%

% b) Vyzváněcí tón: F = [425 0]; [Hz]

% T = [1 3]; [s]

%

% c) Odkazovací tón: F = [950 0 1400 0 1800 0 ]; [Hz]

% T = [0.33 0.03 0.33 0.03 0.33 1.25]; [s]

% d) Obsazovací tón: F = [425 0]; [Hz]

% T = [0.33 0.42]; [s]

Hudební stupnice I

>> logspace(log10(261.63),log10(2*261.63),13)

>>261.63; 277.19; 293.67; 311.13; 329.63; 349.23; 370.00; 392.00; 415.31; 440.01; 466.17; 493.89; 523.26

Hudební stupnice III

close all,clear

x = []; % inicializace promenne

fs = 8000; % zmenit také ve funkci

klavesy = [40 42 44 45 47 49 51 52];

doby = 0.5*ones(1,length(klavesy));

for k = 1:length(klavesy)

ton = nota(klavesy(k),doby(k));

x = [x ton];

end

soundsc(x,fs) % poslech hudebni stupnice

Tónová volbaI (DTMF - Dual Tone Multi-Frequency)

• Frekvence nejsou:

– násobkem jiné frekvence

– rozdílem či součtem frekvencí

Tónová volba II >> signal = DTMFvolba([6 0 3]);

function tony = DTMFvolba(cisla)

Fs = 8000;

t = (0:799)/Fs; % generovani casove osy

f = [697 697 697 770 770 770 852 852 852 941 941 941;

1209 1336 1477 1209 1336 1477 1209 1336 1477 1336 1209 1477];

tony=[];

for i=1:length(cisla),

if(cisla(i)==0), cisla(i)=10; end;

ton1 = 0.5*sin(2*pi*f(1,cisla(i))*t);

ton2 = 0.5*sin(2*pi*f(2,cisla(i))*t);

tony =[tony; ton1+ton2];

end;

tony=tony'; tony=tony(:);

Tabulková (wavetable) syntéza

• Při tabulkové

syntéze simulujeme

nástroj pomocí

vzorků vyjmutých ze

skutečného nástroje

Tabulková (wavetable) syntéza

Tabulková (wavetable) syntéza

• Opatrný výběr period:

– velké změny v amplitudě (vytváří nežádoucí audio efekty)

– změny ve fázi (slyšitelná kliknutí)

E.g. 1

E.g. 2

Tabulková (wavetable) syntéza

Tabulková (wavetable) syntéza

• Lineární prolínaní (crossfade)

Tabulková (wavetable) syntéza

*

=

t

t

t

Tabulková (wavetable) syntéza

t

peak

amplitude

duration

peak amplitude

Tabulková (wavetable) syntéza

t

t

t

high

med.

low

ff

mf

p

Tabulková (wavetable) syntéza

fs=8000;

f0=400;

N0=fs/f0;

n0=0:N0-1;

P=sin(2*pi*f0/fs*n0);

f1=f0*2^(1/12);

N1=fs/f1;

n1=0:N1-1;

delta=f1*length(P)/fs;

% delta=f1/f0; % delta=T0/T1;

ind = round(0:delta:delta*(N1-1))+1;

stem(n1,P(ind))

Tabulková (wavetable) syntéza % transformace tabulky s jednou periodou f0

% na libovolně dlouhý signál o délce doba a o frekvenci f1

doba=1;

ind = mod(round(0:delta:(delta*doba*fs-1)),N0)+1;

stem(ind),

stem(P(ind))

Tabulková (wavetable) syntéza

nT

int ceil

A

B

Tabulková (wavetable) syntéza % transformace tabulky s jednou periodou f0

% na libovolne dlouhy signal o frekvenci f1

% pomoci linearni interpolace

doba=1;

ind = mod(0:delta:(delta*doba*fs-1),N0)+1;

x=ind-floor(ind);

P=[P P(1)];

A=P(floor(ind));

B=P(ceil(ind));

y=(B-A).*x+A;

stem(ind)

stem(y)

A

B

ind

y

x

Tabulková (wavetable) syntéza

% priklad tabulkove syntezy banja

[x,fs]=wavread('banjo.wav');

P=x(144:172);

function y=tabsynt(P,f,doba,fs);

% tabulkova (wavetable) synteza s linearni interpolaci

% P = jedna perioda vzorkovaneho signalu (tabulka)

% f = pozadovana frekvence vystupniho signalu

% doba = trvani vystupniho signalu

% fs = vzorkovaci frekvence výstupniho signalu

% y = vystupni signal

% Pouziti: y = tabsynt(P,f,doba,fs)

% by Roman Cmejla

P=P(:)';

delta=f*length(P)/fs;

ind = mod(0:delta:(delta*doba*fs-1),length(P))+1;

x = ind-floor(ind);

P = [P P(1)];

A = P(floor(ind));

B = P(ceil(ind));

y = (B-A).*x+A;

Tabulková (wavetable) syntéza

y=tabsynt(P,f0,doba,fs);

y=exp(-[0:length(y)-1]./fs./.1).*y;

Tabulková (wavetable) syntéza