Frage

Ich versuche, ein Bild in ein Audiosignal in MATLAB zu konvertieren, indem sie als Spektrogramm Behandlung wie in Aphex Twin Lied auf Windowlicker . Leider Mühe, ich habe ein Ergebnis zu erzielen.

Hier ist es, was ich im Moment habe:

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

Also, ich nehme inversen Fourier-Transformationen auf Säulen meines Bildes und sie dann zusammen setzen ein Signal zu bilden. Darüber hinaus verwendet diese Funktion die Bildverarbeitung Toolbox für MATLAB Bilder lesen. Das Ziel ist eine gewisse Variation von

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

Ergebnis in etwas, das wie das Originalbild aussieht. Ich würde schätzen, sehr viel über jede Hilfe! Ich lerne gerade Signalverarbeitung, also nicht überrascht, wenn es ein offensichtliches Missverständnis ist. Dank!


Bearbeiten : Danke Dave! Ich habe es funktioniert! Ich landete mit diesem:

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

War es hilfreich?

Lösung

Es gibt einige kleine Missverständnisse hier.

Ich werde die Probleme in der Reihenfolge des Auftretens gehen, nicht Grad:

1) Off-by-one-Fehler bei der Berechnung der spectrogramWindow (image)

Der erste Array-Eintrag soll die Komponente von 0 Hz sein, ist die nächste N Hz. Das letzte Element des Arrays sollte die Komponente -N Hz betragen. Allerdings haben Sie berechnet 0Hz.

Ich bin mir nicht sicher, dass die Matlab-Syntax, aber wenn Sie das Bild drehen, wie Sie haben, und dann Streifen der oberen und unteren Linien, bevor es auf den ursprünglichen Anhängen sollten Sie festgelegt werden.

Alternativ können Sie betrachten nicht das Bild selbst anhängen, und nach spectrogramWindow von Bild zu extrahieren, eine Funktion, die Anwendung es hermitischen symmetrisch zu machen.

2) Nimmt man die abs des IFT. Das ist nicht nötig. Tu das nicht.

Was man aus dem iFFT erhalten, wenn die iFFT den rechten Eingang bekommt, ist ganz real.

Du siehst komplexe Werte, weil die Eingabe nicht TATSÄCHLICH hermitischen symmetrisch ist, wie oben beschrieben. Nie Abs () verwenden. Wenn Sie muss betrüge, extrahiert den Realteil, der Müll von der imaginären Komponente wird nicht klappen.

3) Sie werfen die zweite Hälfte des Signals entfernt.

Wenn Sie eine Ausgabe aus dem iFFT erhalten, welches das Signal repräsentiert Sie gefragt haben. Sie denken nicht in Bezug auf die Frequenzen, es ist jetzt eine Audio-Zeitreihen. Halten Sie die ganze Sache.

Hier ist, wie ich sehe es geht:

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

Andere Tipps

Erforschung einfach die genau die gleiche Sache und fand diesen Perl-Skript. Dachte, Sie könnten den Link.

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top