Question

J'essaie de convertir une image en un signal audio dans MATLAB en la traitant comme un spectrogramme comme dans La chanson d'Aphex Twin sur Windowlicker . Malheureusement, j'ai du mal à obtenir un résultat.

Voici ce que j'ai en ce moment:

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

Donc, je prends les Transformées de Fourier Inverses sur les colonnes de mon image, puis je les assemble pour former un signal. Cette fonction utilise également la boîte à outils Image Processing Toolbox pour que MATLAB puisse lire les images. Le but est d’avoir une variation de

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

résulte en quelque chose qui ressemble à l'image originale. J'apprécierais beaucoup toute aide! Je viens d'apprendre le traitement du signal, alors ne soyez pas surpris s'il y a une idée fausse évidente. Merci!

Modifier : Merci, Dave! Je l'ai fait travailler! J'ai fini avec ceci:

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

Était-ce utile?

La solution

Il y a quelques petites idées fausses ici.

Je passerai en revue les problèmes par ordre d’apparition et non par gravité:

1) Erreur "une par une" dans le calcul du spectrogrammeWindow (image)

La première entrée du tableau doit être la composante de 0Hz, la suivante est N Hz. Le dernier élément du tableau devrait être le composant de -N Hz. Cependant, vous avez calculé 0Hz.

Je ne suis pas sûr de la syntaxe matlab, mais si vous renversez l'image comme avant, puis que vous supprimez les lignes du haut et du bas avant de l'ajouter à l'original, vous devriez être défini.

Vous pouvez également envisager de ne PAS ajouter l'image à elle-même, et après avoir extrait spectrogramWindow de l'image, en appliquant une fonction pour la rendre symétrique hermitienne.

2) Prendre les abdominaux de l'IFT. Ce n'est pas nécessaire. Ne fais pas ça.

Ce que vous obtenez de l'iFFT, si l'iFFT obtient la bonne entrée, est tout à fait réel.

Vous voyez des valeurs complexes parce que l'entrée n'est pas réellement symétrique hermitienne, comme décrit ci-dessus. Ne jamais utiliser Abs (). Si vous devez tricher, extrayez la partie réelle, qui ne se pliera pas du composant imaginaire.

3) Vous jetez la seconde moitié du signal.

Une fois que vous obtenez la sortie de l'iFFT, cela représente le signal que vous avez demandé. Ne pensez pas à cela en termes de fréquences, c'est maintenant une série chronologique audio. Gardez le tout.

Voici comment je vois les choses se passer:

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

Autres conseils

Recherchez simplement la même chose et trouvez ce script Perl. Je pensais que vous aimeriez le lien.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top