2009-08-05 9 views
8

Próbuję przekonwertować obraz na sygnał audio w MATLAB, traktując go jako spektrogram as in Aphex Twin's song on Windowlicker. Niestety, mam problem z uzyskaniem wyniku.Odwrócony Spectrogram A La Aphex Twin w MATLAB

tutaj to, co mam w tej chwili:

function signal = imagetosignal(path, format) 

    % Read in the image and make it symmetric. 
    image = imread(path, format); 
    image = [image; flipud(image)]; 
    [row, column] = size(image); 
    signal = []; 

    % Take the ifft of each column of pixels and piece together the real-valued results. 
    for i = 1 : column 

     spectrogramWindow = image(:, i); 
     R = abs(ifft(spectrogramWindow)); 
     % Take only the results for the positive frequencies. 
     signalWindow = R(1 : row/2.0); 
     signal = [signal; signalWindow]; 

    end 

end 

Więc biorę Inverse transformacji Fouriera na łamach mojego obrazu, a następnie umieszczając je ze sobą, tworząc sygnał. Ta funkcja wykorzystuje także narzędzie Image Processing Toolbox do odczytu MATLAB na obrazach. Celem jest uzyskanie pewnej odmiany efektu, aby uzyskać efekt podobny do obrazu oryginalnego. Byłbym wdzięczny za każdą pomoc! Po prostu uczę się przetwarzania sygnału, więc nie zdziw się, jeśli pojawi się oczywiste błędne przekonanie. Dzięki!


Edit: Dzięki Dave! Mam to działa! Skończyło się tak:

function signal = imagetosignal(path, format) 

    % Read in the image and make it symmetric. 
    image = imread(path, format); 
    image = [image; flipud(image)]; 
    [row, column] = size(image); 
    signal = []; 

    % Take the ifft of each column of pixels and piece together the results. 
    for i = 1 : column 

     spectrogramWindow = image(:, i); 
     signalWindow = real(ifft(spectrogramWindow)); 
     signal = [signal; signalWindow]; 

    end 

end 

alt textalt text

+0

Co to jest dokładnie problem? – gnovice

+0

W drodze powrotnej skutecznie brakuje górnej połówki obrazu, a to, co pozostawia smugi w górę, strasznie. –

+0

Cieszę się, że działa. Zapraszam do wyboru mojej odpowiedzi;) –

Odpowiedz

6

Istnieje kilka małych nieporozumień tutaj.

Pójdę przez problemy w kolejności występowania, nie ważności:

1) off by one w obliczeniach spectrogramWindow (image)

Pierwszy wpis tablica powinna być składnik 0 Hz, następny to N Hz. Ostatnim elementem tablicy powinna być składowa -N Hz. Jednak obliczyłeś 0 Hz.

Nie jestem pewien składni matlab, ale jeśli odwrócisz obraz tak jak masz, a następnie usuniesz górną i dolną linię przed dodaniem jej do oryginału, powinieneś być ustawiony.

Można również rozważyć NIE dołączanie obrazu do siebie, a po wyodrębnieniu spektrogramu z obrazu, zastosowanie jakiejś funkcji, aby uczynić ją hermitowską symetryczną.

2) Biorąc abs z IFT. Nie ma potrzeby. Nie rób tego.

Co można uzyskać z iFFT, jeśli iFFT otrzymuje właściwe wejście, jest całkowicie realne.

Widzisz złożone wartości, ponieważ dane wejściowe nie są RZECZYWIŚCIE symetryczne, jak opisano powyżej. Nigdy nie używaj Abs(). Jeśli musisz oszukiwać, wyodrębnij część Real, która nie będzie się składała z elementów wyobraźni.

3) Odrzucasz drugą połowę sygnału.

Po uzyskaniu sygnału wyjściowego z iFFT oznacza to sygnał, o który prosiłeś. Nie myśl o tym w kategoriach częstotliwości, teraz jest to seria czasu audio. Zachowaj całość.

Oto jak widzę idzie:

spectrogramWindow = image(:, i); 
spectrogramWindow = [spectrogramWindow;reverse(spectrogramWindow(skip first and last))] 
signalWindow = ifft(spectrogramWindow); 
signal = [signal; signalWindow]; 
Powiązane problemy