8

Windowlickerの Aphex Twin の曲のように、画像をスペクトログラムとして扱うことにより、MATLAB で画像を音声信号に変換しようとしています。残念ながら、結果が得られずに困っています。

これが私が現時点で持っているものです:

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

そのため、画像の列で逆フーリエ変換を行い、それらをまとめて信号を形成しています。また、この関数は Image Processing Toolbox for 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(画像)の計算における1つずつのエラー

最初のアレイエントリは0Hzのコンポーネントである必要があり、次はNHzです。配列の最後の要素は、-NHzのコンポーネントである必要があります。ただし、0Hzを計算しました。

matlabの構文はわかりませんが、画像をそのまま反転させてから、元の画像に追加する前に上下の行を削除すると、設定する必要があります。

または、画像をそれ自体に追加しないことを検討し、画像からspectrogramWindowを抽出した後、何らかの関数を適用してエルミート対称にすることもできます。

2)IFTの腹筋を取る。必要なし。そうしないでください。

iFFTが正しい入力を取得した場合、iFFTから得られるものは完全に現実的です。

上記のように、入力が実際にはエルミート対称ではないため、複雑な値が表示されています。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 に答える