1

私は、周波数シフトのために見つけることができるいくつかの異なるテクニックを試してきました (具体的には、高周波数信号を低周波数にシフトしたい)。現時点では、私はこのテクニックを使用しようとしています -

元の信号 x(t) を次のように乗算します: cos(2 PI dF t), sin(2 PI dF t) R(t) = x(t) cos(2 PI dF t) I(t) = x(t) sin(2 PI dF t) ここで、dF はシフトするデルタ周波数です。これで、R(t) と I(t) の 2 つの時系列信号が得られました。R(t) を実部、I(t) を虚部として複素フーリエ変換を行います。結果は、周波数シフトされたスペクトルになります。

これを次のコードに解釈しました-

for(j=0;j<(BUFFERSIZE/2);j++)
{
Partfunc = (((double)j)/2048);

PreFFTShift[j+x] = PingData[j]*(cos(2*M_PI*Shift*(Partfunc)));
PreFFTShift[j+1+x] = PingData[j]*(sin(2*M_PI*Shift*(Partfunc)));
x++;
}

//INITIALIZE FFT
status = arm_cfft_radix4_init_f32(&S, fftSize, ifftFlag, doBitReverse); 

//FFT on FFTData
arm_cfft_radix4_f32(&S, PreFFTShift); 

これにより、インターリーブされた real データと imag データと FFT を含む配列が構築されます。次にFFTを逆にしますが、得られる出力はかなり文字化けしています。結果は、私が考えているものと比較して巨大に見えます。周波数がシフトされた信号の痕跡がいくつかありますが、結果はほとんどかなりノイズが多いように見えるため、判断するのは困難です.

また、元の信号の標準 FFT の配列値を単純に回転させて周波数シフトを取得しようとしましたが、役に立ちませんでした。これを行うためのより良い方法はありますか?

4

2 に答える 2

2

次のようなことを試しましたか:

  • フレーム化されたデータごとにハニング ウィンドウを使用する

  • オーディオ データのウィンドウ処理されたフレームを取得したら、それに対して FFT を実行します。

  • 周波数領域で何らかの変換を行います (Flanagan - 位相ボコーダーを使用できます)

  • ここで、IFFT を使用して時間領域に戻る必要があります。

  • IFFT データにハニング ウィンドウを適用する

  • 出力ストリームへの時間領域データの新しいフレームごとにオーバーラップ加算を使用する

私の結果:

連結された 2 つの正弦波 (250Hz と 400Hz) を作成し、1 オクターブ上に移動しました。

ここに画像の説明を入力

青の波形がオリジナルで赤が変更されたもので、オーバーラップ加算とハン ウィンドウによるフェードインとフェードアウトが 1 つ見られます。

于 2013-08-12T16:54:50.707 に答える
1

周波数シフトをより「自然」に聞こえるようにする場合は、すべての初期周波数ビン間の比率を維持する必要があります。シフト量は FFT ビンに依存するため、多くの補間が必要になります。Phase Vocoder アルゴリズムは複数の FFT を使用して、結果の位相歪みを減らします。

于 2013-08-12T15:39:02.670 に答える