logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[MATLAB] Usuwanie echa z dźwięku

radek_konto 25 Kwi 2009 17:01 3969 3
REKLAMA
  • #1 6455693
    radek_konto
    Poziom 2  
    Witam jestem nowym użytkownikiem na forum i przyznam że jeśli chodzi o matlaba to jestem zielony. :oops:
    Mam zrobić projekt który usuwa echo z nagranego przeze mnie dźwięku (nagrałem klaśnięcie w ręce w dużym pustym korytarzu).

    Znalazłem w internecie algorytm przedstawiający ideę homomorficznego rozplatania. Niestety nie wiem bardzo jak to przenieść do programu.

    Wiem ze moje echo i sygnał to splot dwóch funkcji x(t)*h(t) i ze idea polega na zamianie tego mnożenia sygnałów na sumę sygnałów poprzez logarytmowanie, dzięki temu będzie możliwość ich rozłączenia i usunięcia echa.

    Napisałem kawałek programu ale nie wiem co dalej, tzn. jak rozłączyć te sygnały, jak usunąć to echo (najlepiej żeby rozdzielić sygnał echa od oryginalnego i zapisać je do oddzielnych zmiennych).

    
    [x,fs] = wavread('echo.wav'); 
    n = length(x);
    w=log(abs(fft(x)));
    odwr=ifft(w);
    odwrrz=real(odwr);
    %{y = real(ifft(log (abs (FFT (z))))); to działa tak samo jak 3 linie powyżej ale u mnie wyskakiwał błąd „Function 'FFT' is not defined for values of class 'double'”
    %}
    plot (w);
    
    figure;
    plot(odwr);
    
    figure;
    plot(odwrrz);


    Wiem że można użyc też funkcji rceps i cceps ale nie wiem jak one dokładnie działaja :cry:

    Załącznik echo.jpg jest to plik z dźwiękiem echo.wav spakowany rar-em ze zmienionym rozszerzeniem na jpg (inaczej nie chciał sie załączyc) :cry:

    Bardzo proszę o pomoc. Będę wdzięczny za jakiekolwiek porady.
  • REKLAMA
  • #2 6456949
    Xitami
    Poziom 29  
    Echo to splot?
  • REKLAMA
  • #3 6457144
    radek_konto
    Poziom 2  
    Tak echo to splot dwóch funkcji x(t)*h(t) z czego x(t) to to dźwięk a h(t) to echo i właśnie cały w tym problem żeby to rozpleść.
    Poprawiłem trochę mój kod:
    
    [x,fs] = wavread('echo.wav'); 
    dl = length(x);
    w=log(abs(fft(x)));
    ifftX=ifft(w);
    
    [y, ym] = cceps(ifftX); 
    %[y1, ym1] = rceps(ifftX); 
    
    Y=abs(y);
    for k= 1 : (dl-1000)
        if Y(k)<0.2 %| ( Y(k)<0.1 )
            Y(k)=0;
        end
    end
    


    ale wynik to coś takiego:

    [MATLAB] Usuwanie echa z dźwięku

    nie wiem dlaczego na końcu pojawia się pik o prawie takiej samej amplitudzie co na początku
  • #4 6457181
    Xitami
    Poziom 29  
    Za Wiki "In linear acoustics, an echo is the convolution of the original sound with a function representing the various objects that are reflecting it."

    Ale coś we tym jest. Zobacz http://www.dspguide.com/ch22/7.htm
REKLAMA