瞬時周波数を計算して解釈する


9

私は瞬時周波数を計算する原理に不慣れで、多くの疑問を抱きました。これらはすべて、このテキストの最後にある箇条書きリストにあります。テキストは少し長いかもしれませんが、すみませんが、私は本当に自分でその問題に取り組んでみました。

ですから、実数値の信号x t の瞬時周波数f(t)に興味があります。計算は、分析信号z t = x t + j y t )を使用して行われます。ここで、y t x t )のヒルベルト変換です。x(t)z(t)=x(t)+jy(t)y(t)x(t)

解析信号z(t)から瞬時周波数を計算するために、次の論文に従いました。

1992年のArthur E. Barnsによる瞬時周波数と瞬時帯域幅の計算。この論文では、瞬時周波数を計算するための複数の方法を紹介しています。彼が提案した(そして私が使用した)すべての式をすぐに書き留めます。

「学習」のために、MATLABで非常に単純な信号ともう少し複雑な信号をいじって、それらの瞬時周波数を取得したいと考えました。

Fs = 1000;                                            % sampling-rate = 1kHz
t = 0:1/Fs:10-1/Fs;                                    % 10s 'Timevector'
chirp_signal = chirp(t,0,1,2);                         % 10s long chirp-signal, signal 1
added_sinusoid = chirp_signal + sin(2*pi*t*10);        % chirp + sin(10Hz), signal 2
modulated_sinusoid = chirp_signal .* sin(2*pi*t*10);   % chirp * sin(10Hz), signal 3

これら3つの信号の時間領域のプロットは次のようになります。 時間領域プロット

論文のすべての方法を適用した後に得られたすべての瞬間周波数のプロットは次のとおりです。

純粋なチャープ信号の 純粋なチャープ信号の瞬時周波数 瞬時周波数 正弦波が追加されたチャープ信号の瞬時周波数正弦波が追加されたチャープ信号の瞬時周波数 変調されたチャープ信号の瞬時周波数: 変調されたチャープ信号の瞬時周波数 3つの画像すべてで、プロット3と4のy軸が拡大されているため、これらの振幅信号は非常に小さいです!

解析信号から瞬時周波数に到達する最初の可能性は、

f2(t)=12πddtθ(t)
θ(t)

function [instantaneous_frequency] = f2(analytic_signal,Fs)
    factor =  Fs/(2*pi);
    instantaneous_frequency = factor * diff(unwrap(angle(analytic_signal)));
    % Insert leading 0 in return-vector to maintain size
    instantaneous_frequency = [0 instantaneous_frequency];
end

この論文では、Barnsが解析信号から瞬時周波数を計算するための4つの他の方法を提案(または、むしろコンパイル)するようになりました。彼は上の式にも言及していますが、フェーズのあいまいさのために実用的ではないという意見です。彼はそのunwrap()方法を知らなかったと思います、またはその背後にある数学をより正確に言うと。(私、私は瞬間周波数で他のいくつかのソースコードを見て、ちょうど今日、その方法について学びました)

彼の論文では、式のラベルは番号(2)であるため、f(t)にインデックス2を付けました。他のすべてのインデックスは、論文の番号と同じように対応しています。

フェーズのあいまいさのため、彼はむしろ次のように提案しています。

f3(t)=12πx(t)y(t)ax(t)y(t)bx(t)2c+y(t)2d

function [instantaneous_frequency] = f3(analytic_signal,Fs,T)
    x = real(analytic_signal);
    y = imag(analytic_signal);
    diff_x = diff(x);
    diff_y = diff(y);
    factor = Fs/(2*pi);
    a = x(2:end).*diff_y;
    b = y(2:end).*diff_x;
    c = x(2:end).^2;
    d = y(2:end).^2;
    instantaneous_frequency = factor * ((a-b)./(c+d));
    % Insert leading 0 in return-vector to maintain size
    instantaneous_frequency = [0 instantaneous_frequency];
end

f9(t)=12πTarctan[x(t)y(t+T)ax(t+T)y(t)bx(t)x(t+T)c+y(t)y(t+T)d]

function[instantaneous_frequency] = f9(analytic_signal, Fs, T)
    x = real(analytic_signal);
    y = imag(analytic_signal);
    factor = Fs/(2*pi*T);
    a = x(1:end-T).*y(1+T:end);
    b = x(1+T:end).*y(1:end-T);
    c = x(1:end-T).*x(1+T:end);
    d = y(1:end-T).*y(1+T:end);
    instantaneous_frequency = factor.*atan((a-b)./(c+d));
    % Append 0 to return-vector to maintain size
    instantaneous_frequency = [instantaneous_frequency zeros(1,T)];
end

f11(t)=14πTarctan[x(tT)y(t+T)ax(t+T)y(tT)bx(tT)x(t+T)c+y(tT)y(t+T)d]

function [instantaneous_frequency] = f11(analytic_signal, Fs, T)
    x = real(analytic_signal);
    y = imag(analytic_signal);
    factor = Fs/(4*pi*T);
    a = x(1:end-2*T).*y(1+2*T:end);
    b = x(1+2*T:end).*y(1:end-2*T);
    c = x(1:end-2*T).*x(1+2*T:end);
    d = y(1:end-2*T).*y(1+2*T:end);
    instantaneous_frequency = factor.*atan((a-b)./(c+d));
    % Append and insert 0s to maintain size
    instantaneous_frequency = [zeros(1,T) instantaneous_frequency zeros(1,T)];
end

f14(t)=2πT[x(t)y(t+T)ax(t+T)y(t)b(x(t)+x(t+T))2c+(y(t)+y(t+T))2d]

function [instantaneous_frequency] = formula14(analytic_signal, Fs, T);
    x = real(analytic_signal);
    y = imag(analytic_signal);
    factor = 2*Fs/(pi*T);
    a = x(1:end-T).*y(1+T:end);
    b = x(1+T:end).*y(1:end-T);
    c = (x(1:end-T)+x(1+T:end)).^2;
    d = (y(1:end-T)+y(1+T:end)).^2;
    instantaneous_frequency = factor * ((a-b)./(c+d));
    % Append and insert 0s to maintain size
    instantaneous_frequency = [instantaneous_frequency zeros(1,T)];
end

論文で提案されているように、3つすべての近似式TはFs(T = Fs = 1000 = 1s)に設定されていました。

今私の質問は:

  • 式f2とf3は、純粋なチャープ信号に対して同じ結果を返します。彼らは同じように計算するので、それは良いことだと思います。3つの近似メソッドは同じものを返さず、それに近いものも返しません!なぜそうなのですか?(それが単なるプログラミングバグではないことを願っています...)
  • 彼らは同じことを返しますが、特にプロットの最後に、彼らはたくさん「揺れ」始めます。その説明は何ですか?私は最初にエイリアシングのようなものを考えましたが、私のサンプリング周波数は信号の周波数に比べてかなり高いので、それは除外できると思います。
  • 少なくともf2とf3は純粋なチャープ信号で適切に機能するように見えますが、信号内の複数の周波数に関しては、f2とf3を含むすべての方法がひどく失敗するようです。実際には、信号に複数の周波数があることは常に常に当てはまります。では、どのようにして(多かれ少なかれ)正しい瞬間周波数を得ることができますか?

    • 信号に複数の周波数が存在する場合、私は実際に何を期待すればよいのかさえわかりません。この計算では、特定の時点で1つの数値が返されるので、このように、より多くの周波数が存在する場合はどうしますか すべての周波数の平均またはそのようなものを返しますか?
  • そしておそらく私の最も重要な質問は、それが実際の精巧なソフトウェアでどのように扱われるかです。1.75秒での変調信号の瞬時周波数を知りたいと思って、方法f2を選択したとします。これは、「ラッキー」で6 [Hz]に近い数値が得られる可能性が高いためです。結果の隣にいくつかのサンプルを選択すると、残念ながらスパイクの値を選択したため、突然、いくつかの有線の結果が高くなります。これはどのように処理できますか?平均またはそれ以上の中央値フィルターで後処理することによって?特にスパイクが多く隣接している地域では、それが本当に難しいかもしれません。

最後に、それほど重要な質問ではありませんが、瞬間周波数について私が見つけたほとんどの論文が、特に地震のような地震イベントの計算において、地理学の領域からのものであるのはなぜですか。Barneの論文もその一例です。瞬時周波数は多くの領域で興味深いものではありませんか?

これまでのところ、私はすべての返信にとても感謝しています。特に、実際のソフトウェアプロジェクトに実装するためのヒントを誰かから教えられたときは特にそうです;)

敬具、パトリック

回答:


4

実際には答えではありませんが、役立つかもしれません。個人的には、瞬時周波数の概念は十分に狭い帯域の信号に対してのみ役立つことがわかりました。

2つの定常正弦波の単純な例、たとえば100Hzと934Hzを考えます。この場合、確かに瞬時周波数を定義および計算できます(どのような方法でも)が、結果はどうなりますか?瞬時周波数が信号について意味のあることを何と言っても、どのような洞察または特性が可能ですか?同時に複数の周波数を持つ信号に瞬時周波数の概念を適用しても、あまり意味がありません。

そのため、スイープでは適切な結果が得られますが、スイープ+サインでは奇数曲線が得られます。また、スイープの高い部分で小刻みに見える理由もここにあります。信号の帯域幅が高すぎて単一の周波数番号を割り当てることができないため、結果が飛び跳ねます。


これまでのヒントに感謝します。このコメントは良い点だと思います。しかし、「純粋なチャープ信号」の瞬時位相の計算が20Hzを超えると問題が発生するのはなぜでしょうか。決定する周波数はまだ1つしかありません。
muuh

//瞬時周波数の概念は、十分に狭帯域の信号に対してのみ有用です。//------ そう、単一のAMおよびFMの正弦波のように
ロバートブリストウジョンソン

4

少なくともf2とf3は純粋なチャープ信号で適切に機能するように見えますが、信号内の複数の周波数に関しては、f2とf3を含むすべての方法がひどく失敗するようです。実際には、信号に複数の周波数があることは常に常に当てはまります。では、どのようにして(多かれ少なかれ)正しい瞬間周波数を得ることができますか?

ヒルマーが示唆しているように、ヒルベルト変換(または「分析信号」)メソッドは、複数の周波数成分があるため、広帯域では機能しません。この方法は、単一の正弦波コンポーネントに対してのみ実行できます。

したがって、Analytic Signalアプローチでは、このアイデンティティを利用する必要があります。

arctanuarctanv=arctan(uv1+uv)

|uv|f9

しかし、これを正しく行うには、ヒルベルト変換の計算で時変正弦波が1つだけ存在する必要があります。また、「同相」コンポーネントとヒルベルト変換の出力(因果FIRフィルターで遅延される)を合わせる方がよいでしょう。そうでなければあなたはがらくたになります。


1

うわー、なんて大きな質問だ。まず、それほど重要ではない質問に答えます。

最後に、それほど重要な質問ではありませんが、瞬間周波数について私が見つけたほとんどの論文が、特に地震のような地震イベントの計算において、地理学の領域からのものであるのはなぜですか。Barneの論文もその一例です。瞬時周波数は多くの領域で興味深いものではありませんか?

その理由は、地震観測システム「vibroseis」が石油業界で地震調査を行うために使用されているためです。私がリンクしたトラックは約5 Hzから約90 Hzまで振動し、チャープ信号を出すように作ることができます。石油産業には多くのお金があり、これらのシグナルからのリターンを処理することは非常に非常に有利です。したがって、多くの人々は、瞬時周波数技術の検討を含め、そのような信号の分析に何時間も費やしてきました。


TM

このペーパーをチェックしてください。

より良いアプローチは、ここで実装されている「位相加重平均器」を使用する傾向がありますまたは、ここにmatlabへの直接リンクがあります。


1

事実の1年後に回答を提供して申し訳ありませんが、私はこのトピックに関する記事を検索しているときにこの投稿を偶然見つけました。あなたの質問は、創業以来フィールドを悩ませてきた「瞬間的な周波数」の広範囲にわたる意見の相違と解釈を反映しています。ここでの回答の一部として、IFは「狭帯域」または「モノコンポーネント」信号にのみ適用可能であると多くの人が言うでしょう。実際、それは真実ではありません。ヒルベルト変換によって取得されたIFは、広帯域信号や「マルチコンポーネント」信号に対して完全に適切に動作します。これらの問題の多くを回避するために提案されている1つの量は、スペクトログラムを使用して測定できる「加重平均瞬時周波数(WAIF)」です。

J. AcoustのLoughlinを参照してください。Soc。1999年1月午前。IFと一般的な誤解に関する他の優れた論文は、Picinbono(IEEE Trans。Sig。Proc。、March 1997)とVakman(IEEE Trans。Sig。Proc。、April 1996)によるものです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.