Pergunta

Eu estou tentando converter uma imagem em um sinal de áudio em MATLAB tratando-o como um espectrograma como em a canção de Aphex Twin em Windowlicker . Infelizmente, estou tendo problemas para obter um resultado.

Aqui o que eu tenho no 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

Então, eu estou tomando Fourier inversa transforma em colunas de minha imagem e, em seguida, colocá-los juntos para formar um sinal. Além disso, esta função utiliza o Processamento de Imagem Toolbox for MATLAB para ler em imagens. O objetivo é ter alguma variação

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

resultar em algo que se parece com a imagem original. Gostaria muito de receber qualquer ajuda! Estou aprendendo processamento de sinal, por isso não se surpreenda se houver um equívoco óbvio. Obrigado!


Editar : Obrigado Dave! Eu tenho que trabalhar! Eu acabei com isso:

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

text alt texto alternativo

Foi útil?

Solução

Há alguns pequenos equívocos aqui.

Vou passar por problemas na ordem de ocorrência, não severidade:

1) Off-por-um erro no cálculo da spectrogramWindow (imagem)

A primeira entrada da matriz deve ser o componente de 0Hz, o seguinte é N Hz. O elemento final do conjunto deve ser o componente de -N Hz. No entanto, você já calculou 0Hz.

Eu não tenho certeza da sintaxe Matlab, mas se você inverter a imagem que você tem, e depois tira os superiores e inferiores linhas antes de acrescentá-lo ao original, você deve ser definido.

Como alternativa, você poderia considerar não anexando a imagem para si mesmo, e depois de extrair spectrogramWindow da imagem, aplicando alguma função para torná-lo simétrica Hermitian.

2) Tomando o abs do IFT. Não há necessidade. Não faça isso.

O que você sair do iFFT, se o iFFT recebe o direito de entrada, é completamente real.

Você está vendo valores complexos, porque a entrada não é realmente simétrica Hermitian, como descrito acima. Nunca use Abs (). Se você tem de enganar, extrair a parte real, que não irá dobrar no lixo do componente imaginário.

3) Você está jogando fora a segunda metade do sinal.

Depois de conseguir a saída do iFFT, que representa o sinal você pediu. Não pense nisso em termos de frequências, é agora uma série temporal de áudio. Mantenha a coisa toda.

Aqui está como eu vê-lo indo:

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

Outras dicas

Apenas pesquisar exatamente a mesma coisa e encontrei este script perl. Pensei que você pode gostar o link.

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top