Reverter Spectrogram A La Aphex Twin em MATLAB
-
22-07-2019 - |
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
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.