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)
这里有一些小的误解.
我会按照发生的顺序解决问题,而不是严重程度:
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)