2

下の画像に示すようにx1、信号の振幅が最も大きく、信号の振幅が最も小さい理由を知りたいのですが?x2

コードを実行したときx1、最小の振幅、x2中程度の振幅x3、最大の振幅を期待していました。これは、以下の式に示すように、 にx110 を掛けて、別の振幅 10 を加えたものにx2等しいなどです。x1

これらの点を明確にしてください。

ここに画像の説明を入力

4

2 に答える 2

2

信号x3には、振幅が同じで周波数が異なる 3 つのコサインが含まれています。したがって、スペクトルには、理想的には、同じ振幅の 3 つのディラック インパルスが含まれている必要があります。これは、信号を無限に長く観測した場合にのみ当てはまります。L=8000多数のサンプルで構成される信号を「窓処理」しました。8000 個のサンプルを「切り取る」ことは、信号に方形信号を乗算するようなものです。1 つの長方形のスペクトルは、メインローブといくつかの小さなサイドローブで構成される sinc インパルスです。

したがって、得られるスペクトルx3は、3 つのディラックと sinc インパルスの畳み込みになります。DTFT をプロットすると、次のようになります。

ここに画像の説明を入力

DFT は、DTFT のサンプル バージョンです。kDFT 周波数ここに画像の説明を入力は次のように定義されます。

ここに画像の説明を入力

ここNで、DFT の長さです。これが問題の場所です。 と を使用して DFT を計算しN=8192ますfs=8000。したがって、正確な周波数に到達することはありませんf1, f2, f3. 「実際の」ピークに最も近いポイントは次のようになります。

f1 = 2.9297 Hz
f2 = 19.5313 Hz
f3 = 49.8047 Hz

したがって、DFT で表示されるピークは、本来あるべきサイズよりも小さくなっています。

ここに画像の説明を入力

また、実際の周波数と測定された周波数の最大差 ( )f2が DFT の最小ピークにつながることもわかります。周波数の丸め誤差は 未満のままですここに画像の説明を入力。つまり、DFT の長さが長くなるにつれて減少します。

簡単に言えば、周期的な信号の場合、DFTの長さを調整して、DFTが実際の周波数に到達することを確認できます(@ gg349が彼の回答で示唆したように)。N一般に、丸め誤差を小さくして DTFT に近づけるために、DFT の長さを長くすることができます。より良い DTFT を取得して周波数分解能を上げるには、データ長を増やす必要がありますL

于 2014-12-29T14:58:19.043 に答える
0

x1,x2,x3は、3 つの異なる周波数でそれぞれ 1、2、および 3 つの高調波を持ち、すべての高調波には10振幅があります。x1,x2,x3これらの信号を周波数領域で調べると、それぞれ 1、2、および 3 つのピークが存在し、すべてのピークが同じ振幅を持つことが期待されます。x1に 1 つのピークがあり(ここ3Hzで時間について話していると仮定します)、x3周波数 に 3 つのピークがあります3,20,50Hz

今言ったことにもかかわらず、特定の観測ウィンドウを選択せず​​にフーリエ変換の絶対値をプロットすると、たとえばx3、3 つの周波数の 3 つのピークの高さが異なることがわかります。これは、の右上の図とx3、実際には質問に対応していない@hbadertsの回答にも見られます。これは、時間ベクトルtが信号の周期の倍数ではないために発生し、これにより、周期的ではない信号x3(またはx1,x2問題) が発生します (または、少なくとも思ったほど周期的ではありません)。さらに多くの周波数成分がこの図を不鮮明にするため、上記が尊重されることを期待することはできなくなります。

信号を生成していて、センサーからロードしていないため、観測ウィンドウを変更tして、そのウィンドウで信号が周期的になるようにすることができます。この場合に必要な観測ウィンドウは1秒です (各期間が整数回にt1,t2,t3含まれるように)。次に、最後の点を除く、と1sの間の等間隔の点の数を選択できます。つまり、範囲です。t=0t=1[0,1)

議論しなければならない唯一のことは、サンプリング周波数です。これは、信号の最高周波数の 2 倍より高くなければなりません。この場合、最高周波数。はであるため、すべての高調波を解決するにはfmax = 50、上記でサンプリングする必要があります。fs=100Hzまた、サンプリング周波数が自然数である必要があります。そうしないと、 と の間の離散点01等間隔にならず、信号が周期的になりません。

Python で例を示します。Matlab で調整する必要があります。

from numpy import arange, cos
from numpy.fft import rfft, rfftfreq
import matplotlib.pyplot as plt

f1, f2, f3 = 3., 20., 50.  # in Hz
T1, T2, T3 = 1 / f1, 1 / f2, 1 / f3
T_all = 1
# From Shanon theoreom we must use a sampling freq. larger than this:
f_sample = 2 * max([f1, f2, f3])
# we also need to use an integer sampling frequency, or the
# points will not be equispaced between 0 and 1. We then add +1 to f_sample:
dt = 1 / (f_sample + 1)
t = arange(0, T_all, dt)
# another way of generating the points, without fixing the sampling frequency
# follows. In this case one must check that 1 / dt > f_sample afterwards
# t, dt = linspace(0, T_all, 2000, endpoint=False, retstep=True)
x3 = 1 * cos(2 * pi * f1 * t) + 2 * cos(2 * pi * f2 * t) + 3 * cos(2 * pi * f3 * t)

y = rfft(x3)
freqs = rfftfreq(t.size, d=dt)  # in Hz

fig, ax = plt.subplots() # we plot the abs. value of the fft:
# the factor 2/t.size is the normalizing factor between peaks
# of the DFT and original amplitudes in time domain.
ax.plot(freqs, 2 * abs(y) / t.size, 'o')
ax.set_ylim(0, 3.5)
ax.set_xlabel('f  [Hz]')
ax.grid()
fig.show()

離散 DFT は、実際には、指定された周波数でのみゼロ以外の値を示すことがわかります。結果を適切に再スケーリングすることにより、高調波の正確な振幅も回復します。この例では を選択しています1,2,3ここに画像の説明を入力 参考までに、上記のコードのように最小サンプリング レート、つまりf_sample+1Hz で元の時間信号を報告します。さらに、サンプリング周波数は、1)f_sampleアンダーサンプリングを回避し、シャノンの定理を尊重するために、よりも大きくする必要があります。0s2)との間に離散サンプルを均等に分散させるための整数1s。つまり、周期的な信号を得るために。

t=1 の最後の点がどのように欠落しているかに注意してください。 ここに画像の説明を入力

于 2014-12-29T17:34:19.240 に答える