8

我正在尝试将图像转换为 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

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

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

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


编辑:谢谢戴夫!我让它工作了!我最终得到了这个:

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

替代文字 替代文字

4

2 回答 2

6

这里有一些小的误解。

我将按发生的顺序处理问题,而不是严重性:

1)spectrogramWindow(图像)计算中的误差

第一个数组条目应该是 0Hz 的分量,接下来是 N Hz。数组的最后一个元素应该是 -N Hz 的分量。但是,您已经计算出 0Hz。

我不确定matlab的语法,但如果你像你一样翻转图像,然后在将它附加到原始图像之前去掉顶部和底部的线,你应该设置。

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

2) 采用 IFT 的腹肌。没必要。不要那样做。

如果 iFFT 得到正确的输入,你从 iFFT 中得到的东西是完全真实的。

您会看到复杂的值,因为输入实际上不是 Hermitian 对称的,如上所述。永远不要使用 Abs()。如果您必须作弊,请提取实部,它不会从虚部中折叠成垃圾。

3)您正在丢弃信号的后半部分。

一旦您从 iFFT 获得输出,就代表您要求的信号。不要从频率的角度来考虑它,它现在是一个音频时间序列。保留整件事。

这是我的看法:

spectrogramWindow = image(:, i);
spectrogramWindow = [spectrogramWindow;reverse(spectrogramWindow(skip first and last))]
signalWindow = ifft(spectrogramWindow);
signal = [signal; signalWindow];
于 2009-08-05T03:29:22.470 回答
1

只是研究完全相同的东西并找到了这个 perl 脚本。以为你可能喜欢这个链接。

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

于 2010-06-28T21:24:34.430 回答