質問

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

ここに私が今持っているものがあります:

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のImage Processing Toolboxを使用して画像を読み取ります。目標は、いくつかのバリエーションを持つことです

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

alt text alt text

役に立ちましたか?

解決

ここには小さな誤解があります。

重大度ではなく発生順に問題を調べます:

1)spectrogramWindow(image)の計算におけるオフバイワンエラー

最初の配列エントリは0Hzのコンポーネントである必要があり、次はN Hzです。配列の最後の要素は、-N Hzの成分でなければなりません。ただし、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];

他のヒント

まったく同じことを調べて、このperlスクリプトを見つけました。あなたはリンクが好きかもしれないと思った。

http://devrand.org/show_item.html?item=64&page =プロジェクト

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top