2009-08-05 10 views
8

Estoy tratando de convertir una imagen en una señal de audio en MATLAB tratándolo como un espectrograma as in Aphex Twin's song on Windowlicker. Desafortunadamente, estoy teniendo problemas para obtener un resultado.inversa espectrograma A La Aphex Twin en MATLAB

Aquí es lo que tengo en este 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 

lo tanto, estoy tomando inversas Transformadas de Fourier en columnas de mi imagen y luego ponerlos juntos para formar una señal. Además, esta función utiliza el procesamiento de imágenes Toolbox para MATLAB para leer en las imágenes. El objetivo es tener alguna variación de

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

resultado en algo que se parece a la imagen original. ¡Agradecería mucho ayuda! Estoy aprendiendo de procesamiento de la señal, por lo que no se sorprenda si hay un error obvio. ¡Gracias!


Editar: Gracias a Dave! ¡Lo tengo trabajando! Terminé con esto:

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

Entonces, ¿cuál es exactamente el problema que está teniendo? – gnovice

+0

En el camino de regreso, la mitad superior de la imagen no se encuentra, y lo que queda se mancha horriblemente. –

+0

Me alegra que esté funcionando. Siéntase libre de elegir mi respuesta;) –

Respuesta

6

Hay algunas pequeñas ideas falsas aquí.

voy a ir a través de los problemas con el fin de ocurrencia, no gravedad:

1) Off-por-un error en el cálculo de spectrogramWindow (imagen)

La primera entrada de la matriz debe ser el componente de 0Hz, el siguiente es N Hz. El elemento final de la matriz debe ser el componente de -N Hz. Sin embargo, has calculado 0Hz.

no estoy seguro de la sintaxis de MATLAB, pero si poner la imagen que usted tiene, y luego pelar las líneas superior e inferior antes de añadir a la original, que debe fijarse.

Alternativamente, podría considerar NO adjuntar la imagen a sí mismo, y después de extraer el espectrogramaWindow de la imagen, aplicando alguna función para hacerla simétrica hermitiana.

2) Tomando los abs de la IFT. No hay necesidad. No hagas eso.

Lo que obtienes del iFFT, si el iFFT obtiene la entrada correcta, es completamente real.

Está viendo valores complejos porque la entrada no es REALMENTE hermitiana simétrica, como se describió anteriormente. Nunca use Abs(). Si tiene que hacer trampa, extraer la parte real, que no se doble por la basura del componente imaginario.

3) Está tirando la segunda mitad de la señal.

Una vez que obtenga la salida del iFFT, eso representa la señal que ha solicitado. No pensar en él en términos de frecuencias, es ahora una serie de tiempo de audio. Mantener todo.

Así es como lo veo pasando:

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

Sólo investigando exactamente lo mismo y se encontró este script Perl.Pensé que te gustaría el enlace.

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

+1

Enlace ya no funciona. Sin embargo, está disponible en el Archivo de Internet: http://web.archive.org/web/20120224061437/http://devrand.org/view/imageSpectrogram – wizzwizz4