Domanda

Sto cercando di convertire un'immagine in un segnale audio in MATLAB trattandola come uno spettrogramma come in La canzone di Aphex Twin su Windowlicker . Sfortunatamente, ho problemi a ottenere un risultato.

Ecco quello che ho al momento:

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

Quindi, sto prendendo Inverse trasformazioni di Fourier su colonne della mia immagine e poi le sto unendo per formare un segnale. Inoltre, questa funzione utilizza Image Toolbox per MATLAB per leggere le immagini. L'obiettivo è avere una variazione di

spectrogram(imagetosignal('image', 'bmp'));

produce qualcosa che assomiglia all'immagine originale. Gradirei molto qualsiasi aiuto! Sto solo imparando l'elaborazione del segnale, quindi non sorprenderti se c'è un ovvio malinteso. Grazie!


Modifica : grazie Dave! Ho funzionato! Ho finito con questo:

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 text alt text

È stato utile?

Soluzione

Ci sono alcune piccole idee sbagliate qui.

Esaminerò i problemi in ordine di occorrenza, non gravità:

1) Errore Off-by-one nel calcolo della finestra dello spettrogramma (immagine)

La prima voce dell'array dovrebbe essere il componente di 0Hz, la successiva è N Hz. L'elemento finale dell'array dovrebbe essere il componente di -N Hz. Tuttavia, hai calcolato 0Hz.

Non sono sicuro della sintassi del matlab, ma se capovolgi l'immagine come hai fatto, quindi togli le righe superiore e inferiore prima di aggiungerla all'originale, dovresti essere impostato.

In alternativa, potresti considerare di NON aggiungere l'immagine a se stessa e dopo aver estratto la finestra dello spettrogramma dall'immagine, applicando una funzione per renderla simmetrica ermitiana.

2) Prendendo gli addominali della IFT. Non c'è bisogno. Non farlo.

Ciò che ottieni dall'iFFT, se l'iFFT ottiene l'input giusto, è completamente reale.

Stai visualizzando valori complessi perché l'input non è REALMENTE simmetrico eremitico, come descritto sopra. Non usare mai Abs (). Se devi imbrogliare, estrai la parte Reale, che non si piegherà nella spazzatura dal componente immaginario.

3) Stai gettando via la seconda metà del segnale.

Una volta ottenuto l'output dall'iFFT, questo rappresenta il segnale che hai richiesto. Non pensarci in termini di frequenze, ora è una serie temporale audio. Mantieni il tutto.

Ecco come la vedo andare:

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

Altri suggerimenti

Stavo solo cercando la stessa identica cosa e ho trovato questo script perl. Ho pensato che il link potesse piacerti.

http://devrand.org/show_item.html?item=64&page = Progetto

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top