Pregunta

Estoy tratando de convertir una imagen en una señal de audio en MATLAB al tratarla como un espectrograma como en La canción de Aphex Twin en Windowlicker . Lamentablemente, tengo problemas para obtener un resultado.

Aquí está 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

Entonces, estoy tomando transformadas inversas de Fourier en columnas de mi imagen y luego poniéndolas juntas para formar una señal. Además, esta función utiliza la Caja de herramientas de procesamiento de imágenes para que MATLAB lea en imágenes. El objetivo es tener alguna variación de

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

resulta en algo que se parece a la imagen original. Agradecería mucho cualquier ayuda! Solo estoy aprendiendo el procesamiento de la señal, así que no se sorprenda si hay un error obvio. Gracias!


Editar : ¡Gracias Dave! Lo tengo funcionando! 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

texto alternativo ??texto alternativo

¿Fue útil?

Solución

Hay algunas pequeñas ideas falsas aquí.

Revisaré los problemas en orden de ocurrencia, no de gravedad:

1) Error off-by-one en el cálculo de spectrogramWindow (imagen)

La primera entrada de la matriz debería ser el componente de 0Hz, la 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 voltea la imagen como lo hizo y luego quita las líneas superior e inferior antes de agregarla al original, debería estar configurado.

Alternativamente, podría considerar NO agregar la imagen a sí mismo, y después de extraer spectrogramWindow de la imagen, aplicar alguna función para hacerla simétrica hermitiana.

2) Tomar los abdominales del IFT. No hay necesidad. No hagas eso.

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

Estás viendo valores complejos porque la entrada no es REALMENTE simétrica hermitiana, como se describió anteriormente. Nunca use Abs (). Si debe hacer trampa, extraiga la parte Real, que no se doblará en la basura del componente imaginario.

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

Una vez que obtiene la salida del iFFT, eso representa la señal que ha solicitado. No lo piense en términos de frecuencias, ahora es una serie temporal de audio. Conserve todo el asunto.

Así es como lo veo:

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

Otros consejos

Simplemente investigando exactamente lo mismo y encontré este script perl. Pensé que te podría gustar el enlace.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top