0

次のような周波数領域のデータがあります。

ここに画像の説明を入力

これは、ベクトル x の周波数ポイントの振幅を含むベクトル Y があることを意味します。例えば

f = [0 1 2 3 4 5 6 7 8 9 10]
Y = [0 0 0 0 0 1 0 0 0 0  0]

逆フーリエ変換を実行すると、周波数 5Hz の正弦波が得られます。

MATLAB 関数 ifft は、Y と f を時間領域に変換できます。ベクトルを時間領域 y および t と呼びましょう。指定されたサンプリング周波数と指定された信号長で時間領域データを取得する方法を探しています。たとえば、信号長が 1 秒で、サンプリング周波数が 1000Hz の時間領域データが必要です。

MATLAB の ifft 関数の出力は常に入力と同じ長さなので、必要なサンプリング周波数と信号長を得るために入力として何を指定すればよいかわかりません。

要約すると、MATLAB 関数を作成しようとしています。

[t,y] = custom_ifft(f,Y,sampling_frequency,signal_length)

これは、周波数ドメイン データ (f,Y) を時間ドメイン データ (t,y) に変換します。ここで、時間ベクトル t の長さは、信号の長さ (たとえば 1 秒) とサンプリング周波数 ( length(y) /signal_length ) は、sampling_frequency で指定できます

編集:あなたの答えに、あなたのアイデアを実装する方法をMATLABコードに含めてください。私はすでにそれを行う方法の概念を持っていますが、実際の実装を機能させることはできません. 具体的には、 ifft 関数の入力引数として何を指定するかを尋ねています。

y = ifft(input_arg);

(f,Y,sampling_frequency,signal_length) がわかっている場合に input_arg を作成する方法を MATLAB コードで探しています。

期待どおりに機能しない私の実装は次のとおりです。

Y = [0 zeros(1,100) 1 0 0 zeros(1,500) 0 0 1 zeros(1,100)];
Y_interp = interp1(Y,linspace(1,length(Y),2*length(Y)));
y = ifft(Y) ;
y_interp = ifft(Y_interp);
figure;
plot(y);
figure;
plot(real(y_interp));
figure;
plot(abs(y_interp));
4

3 に答える 3

2

サンプル レートと期間がわかっている場合は、ポイント数 N を簡単に計算できます。

N = duration (seconds) * sample_rate (Hz)

周波数領域では、これと同じ数のポイント N が必要です。これより少ない場合は、ゼロで埋めることができます。周波数領域の各ビンで表される周波数は、 はビン番号、 は に等しくなりi / sample_rateます。i0 <= i < N / 2

IFFT の後に純粋なリアルタイム ドメイン信号が必要な場合は、周波数ドメイン データが複素共役対称である必要があることに注意してください。位相を気にしない場合は、実数部を N/2 と虚数部について対称にするだけです。

于 2011-11-23T15:56:28.247 に答える
0

次の手順を実行することで、シンプルかつ柔軟に保ちます。

  1. フフト
  2. ターゲット サンプル レートを開始サンプル レートで割って計算します。
  3. 「rat」コマンドを使用して、ターゲット サンプル レートを取得するアップサンプル/ダウンサンプル数を取得します。
  4. 「resample」コマンドを使用してデータを再サンプリングします。
  5. 一定量のデータのみが必要な場合は、その一部を切り捨ててください。さらにデータが必要な場合は、Paul が提案したように、データを ifft する前にゼロで埋めてください。

あらゆる種類の潜在的な問題と、これをより効率的にする方法があります。たとえば、周波数領域でリサンプリングを行うことができます。ただし、最初はシンプルに保ち、自分のやり方を学びます。

于 2011-11-23T16:18:57.080 に答える
0

元のベクトル要素 K の ifft が、サンプル レート SR で長さ N のベクトルに正弦波周波数 F を生成するようにしたい場合:

スケール係数を使用して元のベクトルを補間またはリサンプリングします: (F * N) / (SR * K)

整数以外のスケール係数の場合、適切な結果を得るには、ミラー化された Sinc 補間カーネルを使用します。

長さ N/2 のベクトルを生成するために、(補間カーネルの幅に応じて) ゼロ パディングまたは補間を続行します。内挿によって N/2 を超える、または 0 未満の有意なビン値が生成される場合は、それらを折りたたんで追加します。

実数ベクトルを複素数ベクトルに変換します (「虚数」要素はすべてゼロで、結果は「偶数」正弦波になります)。

長さ N の共役対称ベクトルを生成するために N/2 の周囲で長さ N/2 のベクトルをミラーリングし、2.0 の倍率で除算します。

必要に応じて、IFFT に組み込まれているスケール ファクターの逆数であるスケール ファクター (1、N、sqrt(N) など) を掛けます。

IFFT()。

于 2011-11-23T17:36:12.977 に答える