私は瞬時周波数を計算する原理に不慣れで、多くの疑問を抱きました。これらはすべて、このテキストの最後にある箇条書きリストにあります。テキストは少し長いかもしれませんが、すみませんが、私は本当に自分でその問題に取り組んでみました。
ですから、実数値の信号x (t )の瞬時周波数に興味があります。計算は、分析信号z (t )= x (t )+ j y (t )を使用して行われます。ここで、y (t )はx (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軸が拡大されているため、これらの振幅信号は非常に小さいです!
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を付けました。他のすべてのインデックスは、論文の番号と同じように対応しています。
フェーズのあいまいさのため、彼はむしろ次のように提案しています。
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
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
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
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の論文もその一例です。瞬時周波数は多くの領域で興味深いものではありませんか?
これまでのところ、私はすべての返信にとても感謝しています。特に、実際のソフトウェアプロジェクトに実装するためのヒントを誰かから教えられたときは特にそうです;)
敬具、パトリック