Goto page 1, 2 Next
sundayman
Guest
Fri Jul 05, 2013 5:34 pm
Potrzebuję zrobić następującą rzecz :
Mam plik audio (taki tam sobie sygnał szumowy raczej, ale zróżnicowany w
czasie (modulowany AM powiedzmy) , o niewielkim paśmie - mniej więcej
100Hz - 2kHz .
I chciałbym zrobić symulację uśredniania tego sygnału, znaczy właściwie
poszczególnych próbek;
bierzemy kolejno 3 sample, uśredniamy - i dajemy jako wynik.
i tak dalej.
Przy czym , żeby to działało kołowo , tj;
1. out = (s1 + s2 + s3 ) /3
2. out = (s2 + s3 + s4 ) /3
3. out = (s3 + s4 + s5 ) /3
4. out = (s4 + s5 + s6 ) /3
itp.
I oczywiście potrzebuję to zrobić dla kilku różnych wartości ilości
próbek do uśredniania (2, 5, 10, itp).
Kiedyś robiłem symulacje przetwarzania pliku audio w jakiejś wersji
SPICE, no ale tam chodziło o określony układ elektroniczny (analogowy) -
jak by zrealizować czysto "matematyczny" proces to nawet nie mam pomysłu.
Poza tym dawno to było i już zapomniałem co i jak.
Macie pomysł, jak by to zrobić ? Może jakiś soft jest, gdzie można by
przeprowadzić takie operacje matematyczne na przebiegu ?
Wejściowy plik audio to kilkadziesiąt sekund, mono 48kHz chyba.
Potrzebne mi to do celów demonstracyjnych - żeby pokazać, jak działa
taka procedura (bo mam ją zaimplementowaną w pewnym urządzeniu, ale nie
da się łatwo tego "wyciągnąć" w postaci liczbowej...).
Help ?
sundayman
Guest
Fri Jul 05, 2013 5:49 pm
Quote:
Pure Data?
no no, ciekawe... Zaraz zobaczę co to za dziwo.
Podobnież też matlab by się nadał, ale też nie znam...
RR
Guest
Fri Jul 05, 2013 5:52 pm
W dniu 2013-07-05 19:34, sundayman pisze:
Quote:
Macie pomysł, jak by to zrobić ? Może jakiś soft jest, gdzie można by
przeprowadzić takie operacje matematyczne na przebiegu ?
Pure Data?
--
rry
Ministerstwo Propagandy
Guest
Fri Jul 05, 2013 6:00 pm
a cool edit pro coś by nie poradził?
sundayman
Guest
Fri Jul 05, 2013 6:05 pm
W dniu 2013-07-05 19:49, sundayman pisze:
Quote:
Pure Data?
fajne, ale mało intuicyjne
No nic, czytam tutorial...
Michał Lankosz
Guest
Fri Jul 05, 2013 6:29 pm
W dniu 2013-07-05 20:05, sundayman pisze:
Quote:
W dniu 2013-07-05 19:49, sundayman pisze:
Pure Data?
fajne, ale mało intuicyjne
No nic, czytam tutorial...
Zamiast Matlaba możesz użyć Octave - to darmowy odpowiednik Matlaba.
Plik wave wczytuje się jedną komendą do zmiennej - wektora. Potem na tym
wektorze można operować jak na elementach tablicy w C - podobna
składnia, pętle for itd, chociaż środowisko "woli" (ze względu na
szybkość) operacje od razu na całych wektorach lub macierzach. W Twoim
przypadku to chyba nie ma żadnego znaczenia. Narysowanie najprostszego
wykresu to też jedna linijka.
--
Michał
sundayman
Guest
Fri Jul 05, 2013 6:29 pm
Quote:
Pure Data?
Generalnie - rewelacja.
Jako muzyk to stwierdzam dodatkowo
No, ale opanowanie tego świetnego narzędzia to mi zajmie duuuużo czasu...
A ja potrzebuję szybko machnąć kilka wykresów - więc wielki dzięki, będę
się tym bawić ale raczej w celach innych niż ten, o który mi teraz chodzi...
Quote:
Zamiast Matlaba możesz użyć Octave - to darmowy odpowiednik Matlaba.
Plik wave wczytuje się jedną komendą do zmiennej - wektora. Potem na tym
wektorze można operować jak na elementach tablicy w C - podobna
składnia, pętle for itd, chociaż środowisko "woli" (ze względu na
szybkość) operacje od razu na całych wektorach lub macierzach. W Twoim
przypadku to chyba nie ma żadnego znaczenia. Narysowanie najprostszego
wykresu to też jedna linijka.
No, zaraz zobaczymy
Michał Lankosz
Guest
Fri Jul 05, 2013 6:56 pm
W dniu 2013-07-05 20:29, sundayman pisze:
Quote:
Zamiast Matlaba możesz użyć Octave - to darmowy odpowiednik Matlaba.
No, zaraz zobaczymy :)
na próbę:
data = [1:1:12]
n=3;
b = ones(n,1)./n;
y = filter(b,1,data)
przetwarzanie wav:
[data,fs] = wavread("sample.wav");
n=3;
b = ones(n,1)./n;
y = filter(b,1,data);
wavwrite(y,"wynik.wav");
gdzie n to liczba uśrednianych próbek. Prawidłowe (dla Ciebie) wartości
wyjściowe zaczynają się od n-tej próbki, bo tu akurat pasował mi filtr
FIR o n współczynnikach, każdy równy 1/n, a filtr ten jest przyczynowy
(tzn bieżąca próbka /wyjściowa/ nie ma wiedzy o przyszłości).
Może być? O to chodziło? Wektor można też uciąć o te kilka próbek...
Średnik na końcu linijki powoduje, że nie wyświetla się w konsoli
zawartość zmiennej (wektora, macierzy). Wszystkie linijki zapisz do
pliku z rozszerzeniem .m, a następnie w konsoli Octave przejdź do
katalogu (komenda cd) i wpisz nazwę tego pliku - skryptu.
Nie próbowałem z plikami wav, ale błędu być nie powinno.
W razie czego
http://www.gnu.org/software/octave/support.html - help w
html i pdf.
--
Michał
Michał Lankosz
Guest
Fri Jul 05, 2013 7:01 pm
W dniu 2013-07-05 20:56, Michał Lankosz pisze:
Quote:
W dniu 2013-07-05 20:29, sundayman pisze:
No tak, nie doczytałem, że to ma być symulacja, czyli krok po kroku...
Też da się zrobić, tylko wymaga ze 3 razy tyle linijek.
Ma być na obrazku, czy same liczby?
To teraz.. kto pierwszy?
--
Michał
sundayman
Guest
Fri Jul 05, 2013 7:03 pm
W dniu 2013-07-05 21:01, Michał Lankosz pisze:
Quote:
W dniu 2013-07-05 20:56, Michał Lankosz pisze:
W dniu 2013-07-05 20:29, sundayman pisze:
No tak, nie doczytałem, że to ma być symulacja, czyli krok po kroku...
Też da się zrobić, tylko wymaga ze 3 razy tyle linijek.
Ma być na obrazku, czy same liczby?
To teraz.. kto pierwszy?
chodzi o obrazek - wygląd przebiegu przed i po uśrednieniem
sundayman
Guest
Fri Jul 05, 2013 7:07 pm
Quote:
W zasadzie operacja, o której mówisz, jest tożsama z filtrem
Savitzky'ego i Golaya o rzędzie równym 1 i długości równej 3 lub więcej.
no patrz, nie wiedziałem, że to ma taką mądrą nazwę
Luke
Guest
Fri Jul 05, 2013 7:09 pm
Dnia 2013-07-05 19:34, Użytkownik sundayman napisał:
Quote:
1. out = (s1 + s2 + s3 ) /3
2. out = (s2 + s3 + s4 ) /3
3. out = (s3 + s4 + s5 ) /3
4. out = (s4 + s5 + s6 ) /3
1. GNU R z jednym z kilku pakietów do czytania/pisania WAV
2. MATLAB z Signal Processing Toolbox
3. Może Scilab?
4. Goły język C z libsndfile
W zasadzie operacja, o której mówisz, jest tożsama z filtrem
Savitzky'ego i Golaya o rzędzie równym 1 i długości równej 3 lub więcej.
R i Matlab udostępniają do tego gotowe funkcje.
Luke
sundayman
Guest
Fri Jul 05, 2013 7:21 pm
Quote:
chodzi o obrazek - wygląd przebiegu przed i po uśrednieniem
znaczy oczywiście, mając wygenerowany przetworzony plik audio, to o
obrazek nietrudno :)
Ale widzę, że bez pomocy, to niestety nie dam se rady
Michał Smolnik
Guest
Fri Jul 05, 2013 8:08 pm
W dniu 05.07.2013 19:34, sundayman pisze:
Quote:
Potrzebuję zrobić następującą rzecz :
Mam plik audio (taki tam sobie sygnał szumowy raczej, ale zróżnicowany w
czasie (modulowany AM powiedzmy) , o niewielkim paśmie - mniej więcej
100Hz - 2kHz .
I chciałbym zrobić symulację uśredniania tego sygnału, znaczy właściwie
poszczególnych próbek;
Potrzebne mi to do celów demonstracyjnych - żeby pokazać, jak działa
taka procedura (bo mam ją zaimplementowaną w pewnym urządzeniu, ale nie
da się łatwo tego "wyciągnąć" w postaci liczbowej...).
Help ?
www.processing.org
Sam niedawno robiłem coś podobnego. Liczyłem RMS sygnału audio.
Sama przyjemność, jest mnóstwo przykładów i bardzo dobry help.
Pozdrawiam,
--
Michał
Michał Lankosz
Guest
Fri Jul 05, 2013 9:57 pm
Skrypt Octave, krok po kroku:
%[data,fs] = wavread("sample.wav");
data = [1:1:12]
len = length(data);
n=3;
y = [];
for i=1:len-3
mean = sum(data(i:i+n-1))./n
y = [y, mean]
t = [1:length(y)];
plot(t,data(1:i),"*b", t,y,"or")
pause
endfor
Znak % zamienia linię na komentarz
Jeśli chcesz rysować od razu całość np. tak:
http://img560.imageshack.us/img560/2783/kci.png
to tu masz kod:
%[data,fs] = wavread("sample.wav");
data = [1,2,3,4,4,4,8,7,2,3,4,3,3,3,1];
len = length(data);
n=3;
b = ones(n,1)./n;
y = filter(b,1,data);
t = [1:length(y)];
plot(t,data,"b*-", t,y,"ro-")
%stem(t,[data', y']);
Odkomentuj pierwszą linię i zakomentuj drugą aby pracować na danych z
wav. stem rysuje próbki, może bardziej przypadnie Ci do gustu, bo to w
końcu jest sygnał spróbkowany, nie ciągły. Usuwając "-" z funkcji plot
pozbędziesz się linii łączących. Oczywiście za długi ten sygnał nie może
być, bo wykres stanie się nieczytelny. Można wybrać z wektora jakiś
interesujący krótszy zakres. Częściowo pomoże narzędzie lupa. Na
wykresie możesz wprowadzać oznaczenia osi, danych, tytuł, siatkę, kolory.
kod wklejasz do pliku tekstowego np sundy.m i wywołujesz wpisując w
linii komend Octave: sundy.
--
Michał
Goto page 1, 2 Next