-
21. Data: 2013-07-06 10:02:30
Temat: Re: program do symulacji obróbki audio ?
Od: Miroslaw Kwasniak <m...@i...zind.ikem.pwr.wroc.pl>
Michał Lankosz <m...@t...pl> wrote:
> największa próbka z 10-ciu kolejnych (pętla for, może da się ją ominąć?):
> data2 = max(data1(i:i+10));
i:i+10 to też pętla ;) Ale ukryta - taki zabieg nazywamy w octave/matlabie
wektoryzacją zagadnienia.
> liczby rozdzielone dwukropkiem oznaczają przedział
> tylko że trzeba w pętli ten wektor sklejać, tzn za każdym obiegiem pętli
> doklejać kolejną wartość, coś w rodzaju:
> data3 = [];
> for i=1:10:data_length % i inkementuje się co 10!
> data2 = max(data1(i:i+10));
> data3 = [data3, data2];
> endfor
> no i teraz już ten filter.
Modyfikacje Twojego rozwiązania:
1) Polecenia "data3 = []" i "data3 = [data3, data2]" to wygodny zapis dla
nieznanej długości data3, ale kosztują: w każym obiegu pętli wykonujesz
dodatkowo niepotrzebne operacje:
-- utwórz nową tablicę data3 o długości length(data3)+1
-- skopiuj starą do nowej
-- skasuj starą
Remedium: prealokacja tablicy
L=floor(length(data1)/10);
data3=zeros(1,L);
for i=1:L
data3[i]= max(data1((i-1)*10+(1:10)))
endfor
2) Na ogół 10<L, więc lepiej zmienić kolejność jawnej i niejawnej pętli,
jawne (czyli niezwektoryzowane) wykonują się wolniej
Remedium poniżej (przy założeniu, że data1 jest wektorem kolumnowym);
ii=1:10:length(data1);
data3=data1(ii).';
for i=1:9
data3=max([ data3; data1(i+ii).' ]);
endfor
3) Obie pętle można w tym zagadnienu zwektoryzować, ale tu opłacalność
pewnie żadna, a czytelność kodu spada:
l=length(data1);
i=ones(10,l/10);
i(1,:)=1:10:l;
i=cumsum(i);
data3=max(data1(i));
clear i;
;)
-
22. Data: 2013-07-06 11:45:23
Temat: Re: program do symulacji obróbki audio ?
Od: sundayman <s...@p...onet.pl>
W dniu 2013-07-06 09:13, Michał Lankosz pisze:
> W dniu 2013-07-06 02:08, sundayman pisze:
>> to jest właśnie to, o co chodzi ! Znaczy prawie... :)
> [...]
>> Natomiast muszę jeszcze poprosić o dalszą pomoc :)
>> Czyli potrzebne jest ostatecznie :
>>
>> 1. prostowanie sygnału
>> 2. wybór największej próbki z kolejnych 10-ciu
>> 3. uśrednianie wg. wcześniejszej procedury
>>
>> Da się tak zrobić ??
>>
>
> Da się, nie ma problemu. Może z dalszą pomocą w postaci kolejnych wersji
> programu przejdę na priv. Tylko nie teraz
> Na szybko kilka wskazówek, może sobie sam poradzisz:
> prostowanie sygnału:
> data1 = abs(data);
> największa próbka z 10-ciu kolejnych (pętla for, może da się ją ominąć?):
> data2 = max(data1(i:i+10));
> liczby rozdzielone dwukropkiem oznaczają przedział
> tylko że trzeba w pętli ten wektor sklejać, tzn za każdym obiegiem pętli
> doklejać kolejną wartość, coś w rodzaju:
> data3 = [];
> for i=1:10:data_length % i inkementuje się co 10!
> data2 = max(data1(i:i+10));
> data3 = [data3, data2];
> endfor
> no i teraz już ten filter.
>
> Dla sprawdzenia możesz w każdym miejscu wpisać plot(data3) na przykład i
> zobaczyć dany wykres. Dla dużej liczby próbek na wykresie można
> zrezygnować z kropek danych, zostawić tylko linie
> plot(t,y,"g-"); t-wektor czasu, a właściwie to numer próbki, y dane,
> g to kolor, - to rysowanie linią. "g:" narysuje Ci kropkowany wykres, a
> "g--" linią przerywaną.
fantastycznie, spróbuję toto poskładać.
Tylko najpierw niestety muszę odwalić pańszczyznę...
WIFE> CONFIG SUNDAYMAN(VACUUM CLEANER, FAST)
WIFE> CALL CLEANING(ALL_ROOMS)
WIFE> SETUP SPEED=ULTRAHIGH
WIFE> SOUND=OFF ' SILENCE MODE/MORDA_W_KUBEŁ
itp...
-
23. Data: 2013-07-07 01:16:53
Temat: Re: program do symulacji obróbki audio ?
Od: Michał Lankosz <m...@t...pl>
W dniu 2013-07-06 10:02, Miroslaw Kwasniak pisze:
> 1) Polecenia "data3 = []" i "data3 = [data3, data2]" to wygodny zapis dla
> nieznanej długości data3, ale kosztują: w każym obiegu pętli wykonujesz
> 2) Na ogół 10<L, więc lepiej zmienić kolejność jawnej i niejawnej pętli,
> jawne (czyli niezwektoryzowane) wykonują się wolniej
> 3) Obie pętle można w tym zagadnienu zwektoryzować, ale tu opłacalność
> pewnie żadna, a czytelność kodu spada:
Wszystko racja lub zapewne racja. Wyszedłem z wprawy, do tego dochodzą
naleciałości z C. Myślę, że dla sundymana moje przykłady mogą być
bardziej przejrzyste, chociaż zdaję sobie sprawę z kiepskości tej
implementacji.
Najmocniejszą stroną Matlab/Octave są operacje na macierzach, dlatego na
wszelkie obliczenia trzeba odpowiednio popatrzeć... jak w Matrixie ;)
Nie jest to bardzo trudne, wymaga tylko pewnej wprawy.
> data3=data1(ii).';
Kropka w większości przypadków wiem co robi. Apostrof transponuje
macierz/wektor. Ale .' nie kojarzę.
--
Michał
-
24. Data: 2013-07-07 03:06:26
Temat: Re: program do symulacji obróbki audio ?
Od: sundayman <s...@p...onet.pl>
Zrobiłem tak ;
data =
[2,6,3,8,4,6,15,20,40,20,25,98,17,34,5,23,5,3,35,44,
23,17,19,16,2,3,8,4,7,4];
len = length(data);
data1 = abs(data)
data3 = [];
a=3; % ilość próbek do wartości max
for i=1:a:length(data1)
data2 = max(data1(i:i+(a-1)));
data3 = [data3, data2];
endfor
% uśrednianie
n=2; % ilość próbek uśredniania
b = ones(n,1)./n;
y = filter(b,1,data3);
t = [1:length(data1)];
%plot(t,data1,"b*-")
t2 = [1:length(data3)];
plot(t,data1,"b*-", t2*a,y, "r*-")
____________________________________________
na razie na danych ręcznie wpisanych, żeby sprawdzić.
No i chyba - kuśwa działa ! :))
Jutro spróbuję na wav.
-
25. Data: 2013-07-07 12:43:55
Temat: Re: program do symulacji obróbki audio ?
Od: Miroslaw Kwasniak <m...@i...zind.ikem.pwr.wroc.pl>
Michał Lankosz <m...@t...pl> wrote:
> > data3=data1(ii).';
> Kropka w większości przypadków wiem co robi. Apostrof transponuje
> macierz/wektor. Ale .' nie kojarzę.
Nie, .' jest transpozycją, a sam apostrof to
http://pl.wikipedia.org/wiki/Sprzężenie_hermitowskie
_macierzy
Co dla macierzy rzewywistych niczym się nie różni ;)
-
26. Data: 2013-07-07 15:40:50
Temat: Re: program do symulacji obróbki audio ?
Od: sundayman <s...@p...onet.pl>
> Wszystko racja lub zapewne racja. Wyszedłem z wprawy, do tego dochodzą
> naleciałości z C. Myślę, że dla sundymana moje przykłady mogą być
> bardziej przejrzyste, chociaż zdaję sobie sprawę z kiepskości tej
> implementacji.
Tak jest właśnie - jest to dla mnie ciut bardziej zrozumiałe :)
Jak napisałem, na ręcznie wprowadzonych danych generalnie jest ok,
natomiast przy próbie wygenerowania WAV już jest gorzej.
Mam tak :
[data,fs] = wavread("audio.wav");
%data =
[2,6,3,8,4,6,15,20,40,20,25,98,17,34,5,23,5,3,35,44,
23,17,19,16,2,3,8,4,7,4];
len = length(data);
data1 = abs(data)
data3 = [];
a=10; % ilość próbek do wartości max
for i=1:a:length(data1)-a
data2 = max(data1(i:i+(a-1)));
data3 = [data3, data2];
endfor
% uśrednianie
n=2; % ilość próbek uśredniania
b = ones(n,1)./n;
y = filter(b,1,data3);
wavwrite(y,"wynik.wav");
%t = [1:length(data1)];
%plot(t,data1,"b*-")
%t2 = [1:length(data3)];
%plot(t,data1,"b*-", t2*a,y, "r*-") % to odblokować
%stem(t,[data', y']);
***************************
i teraz, dla a=10 jak powyżej, wywala mi błąd, że
"Y has more than 32767 columns, too many for WAV-file"
tego akurat nie rozumiem. Znaczy chodzi o to, że wartość wykracza poza
dopuszczalne 16 bitów ? Ale jakim cudem, bo przecież nie powinno być
więcej niż jest maksymalnie w audio.wav ?
Jak zwiększę a=100 to wtedy niby generwuje ten WAV, ale nie daje się on
otworzyć. Wieczorem spróbuję powalczyć, bo w sumie to chciałbym zrobić
tak, żeby niezależnie od wyboru "a" i "n" WAV wygenerowany był takiej
samej długości jak źródłowy.
Czyli trzeba by powielać dane wyjściowe i posklejać je w jeden wav.
Próbki będą znaczy się powtarzać, ale dzięki temu będzie można
ładnie porównać obie "fale" i posłuchać także..
-
27. Data: 2013-07-07 18:59:39
Temat: Re: program do symulacji obróbki audio ?
Od: Michał Lankosz <m...@t...pl>
W dniu 2013-07-07 15:40, sundayman pisze:
> "Y has more than 32767 columns, too many for WAV-file"
>
Kolejne próbki mają być w kolejnych wierszach, dwie kolumny to sygnał
stereo. Czyli wpisz:
wavwrite(y.',"wynik.wav");
Poczytaj o wavwrite, bo domyślnie wstawia w nagłówku częstotliwość
próbkowania 8kHz, a można wymusić inną.
--
Michał
-
28. Data: 2013-07-08 03:29:47
Temat: Re: program do symulacji obróbki audio ?
Od: sundayman <s...@p...onet.pl>
Ostatecznie mam takie coś :
[data,fs] = wavread("audio.wav");
%data =
[2,6,3,8,4,6,15,20,40,20,25,98,17,34,5,23,5,3,35,44,
23,17,19,16,2,3,8,4,7,4];
len = length(data);
data1 = abs(data)
data3 = [];
a=44; % ilość próbek do wartości max
for i=1:a:length(data1)-a
data2 = max(data1(i:i+(a-1)));
data3 = [data3, data2];
endfor
% uśrednianie
n=30; % ilość próbek uśredniania
b = ones(n,1)./n;
y = filter(b,1,data3);
% składanie WAV
data4 = [];
for i=1:length(y)
probka = y(i:i);
for j=1:a
data4 = [data4,probka];
endfor
endfor
wavwrite(data4.', 44100 , "wynik_n30.wav");
*************************************
No muszę powiedzieć - działa :)
Nawet chyba udało mi się zrobić, żeby wynikowy wav miał tą samą
długość,co wejściowy (rozciągnąłem po prostu z tym samym
współczynnikiem, o który się skraca w wyniku znajdowania wartości
maksymalnej).
Teraz mogę sobie testować w te i wefte na różnych parametrach - no coś
pięknego. I z tego co widzę, to się nawet chyba zgadza z empirią :)
Panie Michale, jest pan wielki ! Zazdroszczę znajomości tego narzędzia -
coś mi cholerycznie ciężko nad tym zapanować, ale warto się pomęczyć.
Tak że - słów podziękowań brak mi po prostu :)
Oczywiście pozostałym kolegom także dziękuję bardzo.
*************************************
Na wszelki wypadek zapytam jeszcze na koniec ;
jak widać zmieniłem tą linię :
data2 = max(data1(i:i+a))); * gdzie oczywiście "a" to przedział
szukania maximum (zastąpiłem "10" z przykładu kolegi zmienną "a" , żeby
mieć łatwiej w razie zmian wartości)
na następującą wersję :
data2 = max(data1(i:i+(a-1)));
bo wydaje mi się, że w wersji "źródłowej" robi się zakres o 1 za duży
(np. dla przedziału 10 zakres byłby 10:20 zamiast wymaganego 10:19).
Wygląda mi to na po prostu drobną pomyłkę kolegi, ale wolę się upewnić -
czy wszak dobrze zrobiłem ?
-
29. Data: 2013-07-08 08:15:18
Temat: Re: program do symulacji obróbki audio ?
Od: Michał Lankosz <m...@t...pl>
W dniu 2013-07-08 03:29, sundayman pisze:
> Panie Michale, jest pan wielki ! Zazdroszczę znajomości tego narzędzia -
> coś mi cholerycznie ciężko nad tym zapanować, ale warto się pomęczyć.
Ja już bardzo dużo zapomniałem. Matlab to wielkie narzędzie! Fajnie, że
ma darmowy odpowiednik, a przynajmniej namiastkę.
> [...]
> bo wydaje mi się, że w wersji "źródłowej" robi się zakres o 1 za duży
> (np. dla przedziału 10 zakres byłby 10:20 zamiast wymaganego 10:19).
> Wygląda mi to na po prostu drobną pomyłkę kolegi, ale wolę się upewnić -
> czy wszak dobrze zrobiłem ?
Tak, błąd. Zawsze możesz sprawdzić na danych testowych. W linii poleceń
wpisujesz nazwę zmiennej i wyświetla Ci jej wartość (skalar, wektor,
macierz). Size(x) podaje rozmiar. A widzisz, gdybyś miał plik wave
stereofoniczny do wavread do data1 wpisze macierz, dwie chyba kolumny
kanałów. Żeby wyciągnąć jedną kolumnę piszesz:
chan1 = data1(:,1)
gdzie 1 wybiera pierwszą kolumnę.
Świetnie! Widzę, że dalej już sam sobie poradzisz :)
--
Michał