反向谱图A在MATLAB中的La Aphex Twin

Sco*_*ott 8 matlab image-manipulation signal-processing fft inverse

我试图通过将其视为一个频谱将图像转换成音频信号在MATLAB 中的Aphex Twin酒店的宋Windowlicker.不幸的是,我无法获得结果.

这就是我现在所拥有的:

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
Run Code Online (Sandbox Code Playgroud)

所以,我正在对我的图像列进行逆傅里叶变换,然后将它们组合在一起形成一个信号.此外,此功能使用MATLAB的图像处理工具箱读取图像.目标是有一些变化

spectrogram(imagetosignal('image', 'bmp'));
Run Code Online (Sandbox Code Playgroud)

导致看起来像原始图像的东西.我非常感谢任何帮助!我只是在学习信号处理,所以如果有明显的误解,不要感到惊讶.谢谢!


编辑:谢谢戴夫!我搞定了!我最终得到了这个:

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
Run Code Online (Sandbox Code Playgroud)

替代文字 替代文字

Dav*_*ble 6

这里有一些小的误解.

我会按照发生的顺序解决问题,而不是严重程度:

1)谱图计算中的一个误差窗口(图像)

第一个数组条目应该是0Hz的分量,下一个是N Hz.数组的最后一个元素应该是-N Hz的分量.但是,你计算了0Hz.

我不确定matlab的语法,但如果您按原样翻转图像,然后在将其附加到原始图像之前去掉顶部和底部的线条,则应该进行设置.

或者,您可以考虑不将图像附加到自身,并在从图像中提取spectrogramWindow后,应用一些函数使其成为Hermitian对称.

2)取IFT的绝对值.没必要.不要那样做.

如果iFFT获得正确的输入,你从iFFT中获得的是完全真实的.

您正在看到复数值,因为输入不是实际的埃尔米特对称,如上所述.永远不要使用Abs().如果你必须作弊,提取Real部分,它不会从虚构组件中折叠起来.

3)你丢掉了信号的后半部分.

从iFFT获得输出后,表示您要求的信号.不要在频率方面考虑它,它现在是音频时间序列.保持整个事情.

以下是我的看法:

spectrogramWindow = image(:, i);
spectrogramWindow = [spectrogramWindow;reverse(spectrogramWindow(skip first and last))]
signalWindow = ifft(spectrogramWindow);
signal = [signal; signalWindow];
Run Code Online (Sandbox Code Playgroud)