dla hecy i z nudów skleciłem w scilab'ie następujący skrypt:
//-------------------------------
clear;
FN=250; //fala nośna
NH=15; //rząd trafa hilberta
// hb=hilb(NH,'hm'); //w wektorze hb współczynniki filtra.
function q=szift(x, V)
q=[x V]; //dopisuję element na początek bufora V
q(length(q))=[]; //wywalam ostatni element
endfunction;
[jg,fprjg, bits]=wavread("jg.wav"); //z 5 sek głosu 8bitów, 8000Hz
N=length(jg);
t=soundsec(N/fprjg,fprjg);
ss=sin(2*%pi*FN*t); //wektory ortogonalnych nośnych
sc=cos(2*%pi*FN*t);
s2 =zeros(t);
X =zeros(1,NH);
//właściwy modulator. te porypane liczby to wsp. trafa hilbetra z oknem hamminga
for k=1:1:N,
q=-0.072757*X(1) - 0.0322377*X(3) - 0.1363129*X(5) - 0.6076190*X(7) + 0.6076190*X(9) + 0.1363129*X(11) + 0.0322377*X(13) + 0.0072757*X(15);
i=X(8);
// s2(k)=(jg(k)*sc(k)) + (jg(k)*ss(k)); //dsb
s2(k)=i*sc(k) - q*ss(k); //- usb, + lsb
X = szift(jg(k), X);
end
playsnd(s2, fprjg);
skrypt czyta plik 'jg.wav' ze moim szczebiotem.
nagrany pod win$. z 5 sekund gadania, słowo 8 bitów. fpróbk = 8000Hz.
następnie pcha go do wektora 'jg'. potem opóźnia, liczy trafo hilb. i dalej znana klasyka.
robi się wektor s2 z próbkami o przesuniętym widmie o FN=250Hz
potem s2 zostaje odszczekany przez głośniki.
efekt artystyczny - jakby kaczor (Donald) gadał po sztachnięciu czystym helem.
pliku jg.wav nie spuszczam, bo podobno to jakieś punkty generuje.
zachęcam do sprawdzenia działania skryptu.
proszę znawców DSP o sugestie, jak algorytm podkręcić,
jak oszacować długość vektora trafa hilberta, żeby niepożądaną wstęgę tłumił o zadaną wartość i co komu do głowy przyjdzie.
dodam, że mając ortogonalne sygnały właściwie wszystkie modulacje można wyliczyć...
j
//-------------------------------
clear;
FN=250; //fala nośna
NH=15; //rząd trafa hilberta
// hb=hilb(NH,'hm'); //w wektorze hb współczynniki filtra.
function q=szift(x, V)
q=[x V]; //dopisuję element na początek bufora V
q(length(q))=[]; //wywalam ostatni element
endfunction;
[jg,fprjg, bits]=wavread("jg.wav"); //z 5 sek głosu 8bitów, 8000Hz
N=length(jg);
t=soundsec(N/fprjg,fprjg);
ss=sin(2*%pi*FN*t); //wektory ortogonalnych nośnych
sc=cos(2*%pi*FN*t);
s2 =zeros(t);
X =zeros(1,NH);
//właściwy modulator. te porypane liczby to wsp. trafa hilbetra z oknem hamminga
for k=1:1:N,
q=-0.072757*X(1) - 0.0322377*X(3) - 0.1363129*X(5) - 0.6076190*X(7) + 0.6076190*X(9) + 0.1363129*X(11) + 0.0322377*X(13) + 0.0072757*X(15);
i=X(8);
// s2(k)=(jg(k)*sc(k)) + (jg(k)*ss(k)); //dsb
s2(k)=i*sc(k) - q*ss(k); //- usb, + lsb
X = szift(jg(k), X);
end
playsnd(s2, fprjg);
skrypt czyta plik 'jg.wav' ze moim szczebiotem.
nagrany pod win$. z 5 sekund gadania, słowo 8 bitów. fpróbk = 8000Hz.
następnie pcha go do wektora 'jg'. potem opóźnia, liczy trafo hilb. i dalej znana klasyka.
robi się wektor s2 z próbkami o przesuniętym widmie o FN=250Hz
potem s2 zostaje odszczekany przez głośniki.
efekt artystyczny - jakby kaczor (Donald) gadał po sztachnięciu czystym helem.
pliku jg.wav nie spuszczam, bo podobno to jakieś punkty generuje.
zachęcam do sprawdzenia działania skryptu.
proszę znawców DSP o sugestie, jak algorytm podkręcić,
jak oszacować długość vektora trafa hilberta, żeby niepożądaną wstęgę tłumił o zadaną wartość i co komu do głowy przyjdzie.
dodam, że mając ortogonalne sygnały właściwie wszystkie modulacje można wyliczyć...
j