FFTのピーク周波数以外の周波数のレベルを下げることはできますか?
17 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Shuichi Watanabe
am 13 Feb. 2018
Kommentiert: Takuji Fukumoto
am 17 Feb. 2018
100kHz正弦波を周波数1MHzでサンプリングした信号を2048点でFFTした場合に、振幅1、10^-5、10^-10の正弦波いずれも、ピーク高-30~40dBあたりに下辺のレベルが形成されて同じような形状の波形が形成されます。 これを、共通した最小のレベルが形成されて、そこから振幅に比例した高さのピークが立つような波形にすることは可能でしょうか。 使用したコードは以下です。
Fs = 1e+6; % サンプリング周波数
Ts = 1/Fs; % サンプリング周期
Ls = 2048; % サンプル数
t = (0:Ls-1)*Ts; % 時刻ベクトル
Fi = Fs * 0.1; % 入力正弦波周波数
x1 = (1e-0)*sin(2*pi*Fi*t); % 振幅1
x2 = (1e-5)*sin(2*pi*Fi*t); % 振幅10^-5
x3 = (1e-10)*sin(2*pi*Fi*t); % 振幅10^-10
if 0
for i=1:Ls
%%ハン窓
x1(i) = x1(i) * (0.5-0.5*cos(2*pi*(i-1)/(Ls-1)));
x2(i) = x2(i) * (0.5-0.5*cos(2*pi*(i-1)/(Ls-1)));
x3(i) = x3(i) * (0.5-0.5*cos(2*pi*(i-1)/(Ls-1)));
%%ブラックマン・ハリス窓
x1(i) = x1(i) * (0.35875-0.48829*cos(2*pi*(i-1)/(Ls-1))+0.14128*cos(4*pi*(i-1)/(Ls-1))-0.01168*cos(6*pi*(i-1)/(Ls-1)));
x2(i) = x2(i) * (0.35875-0.48829*cos(2*pi*(i-1)/(Ls-1))+0.14128*cos(4*pi*(i-1)/(Ls-1))-0.01168*cos(6*pi*(i-1)/(Ls-1)));
x3(i) = x3(i) * (0.35875-0.48829*cos(2*pi*(i-1)/(Ls-1))+0.14128*cos(4*pi*(i-1)/(Ls-1))-0.01168*cos(6*pi*(i-1)/(Ls-1)));
end
end
y1 = fft(x1);
P21 = 10*log10(abs(y1/Ls));
P11 = P21(1:Ls/2+1);
y2 = fft(x2);
P22 = 10*log10(abs(y2/Ls));
P12 = P22(1:Ls/2+1);
y3 = fft(x3);
P23 = 10*log10(abs(y3/Ls));
P13 = P23(1:Ls/2+1);
f = Fs*(0:(Ls/2))/Ls;
hold off;
plot(f,P11);
hold on;
plot(f,P12);
hold on;
plot(f,P13);
xlabel('f (Hz)')
ylabel('|P| (dB)')
途中の窓関数を掛けても全体の症状は変わりません。宜しくお願い致します。
0 Kommentare
Akzeptierte Antwort
Takuji Fukumoto
am 13 Feb. 2018
Bearbeitet: Takuji Fukumoto
am 14 Feb. 2018
まず、下記についてですが、
>ピーク高-30~40dBあたりに下辺のレベルが形成されて
データの長さLsが周期の整数倍でないことで別の成分が見えてしまっています。
Fi = Fs * 0.1; % 入力正弦波周波数
なのでLsが10の倍数であればノイズフロアは量子化誤差レベルまでさがります。
その上で3つの入力信号に対して同じホワイトノイズをかけることで同じノイズフロアを指定することができます。 Lsとx1,x2,x3の定義のみを書き換えたものです
Fs = 1e+9; % サンプリング周波数
Ts = 1/Fs; % サンプリング周期
Ls = 2000; % サンプル数
t = (0:Ls-1)*Ts; % 時刻ベクトル
Fi = Fs * 0.1; % 入力正弦波周波数
Ti = 1/Fi;
x1 = (1e-0)*sin(2*pi*Fi*t)+1e-12*rand([1 Ls]); % 振幅1
x2 = (1e-5)*sin(2*pi*Fi*t)+1e-12*rand([1 Ls]); % 振幅10^-5
x3 = (1e-10)*sin(2*pi*Fi*t)+1e-12*rand([1 Ls]); % 振幅10^-10
if 0
for i=1:Ls
%%ハン窓
x1(i) = x1(i) * (0.5-0.5*cos(2*pi*(i-1)/(Ls-1)));
x2(i) = x2(i) * (0.5-0.5*cos(2*pi*(i-1)/(Ls-1)));
x3(i) = x3(i) * (0.5-0.5*cos(2*pi*(i-1)/(Ls-1)));
%%ブラックマン・ハリス窓
x1(i) = x1(i) * (0.35875-0.48829*cos(2*pi*(i-1)/(Ls-1))+0.14128*cos(4*pi*(i-1)/(Ls-1))-0.01168*cos(6*pi*(i-1)/(Ls-1)));
x2(i) = x2(i) * (0.35875-0.48829*cos(2*pi*(i-1)/(Ls-1))+0.14128*cos(4*pi*(i-1)/(Ls-1))-0.01168*cos(6*pi*(i-1)/(Ls-1)));
x3(i) = x3(i) * (0.35875-0.48829*cos(2*pi*(i-1)/(Ls-1))+0.14128*cos(4*pi*(i-1)/(Ls-1))-0.01168*cos(6*pi*(i-1)/(Ls-1)));
end
end
y1 = fft(x1);
P21 = 10*log10(abs(y1/Ls));
P11 = P21(1:Ls/2+1);
y2 = fft(x2);
P22 = 10*log10(abs(y2/Ls));
P12 = P22(1:Ls/2+1);
y3 = fft(x3);
P23 = 10*log10(abs(y3/Ls));
P13 = P23(1:Ls/2+1);
f = Fs*(0:(Ls/2))/Ls;
hold off;
plot(f,P11);
hold on;
plot(f,P12);
hold on;
plot(f,P13);
xlabel('f (Hz)')
ylabel('|P| (dB)')
2 Kommentare
Takuji Fukumoto
am 17 Feb. 2018
はい、窓関数の種類によっても変わりますし、 同じ窓関数ノイズフロアを下げる方法としては、
・ノイズを分散させる→高い周波数成分まで利用する→サンプリング周波数Fsを大きくする。
・周波数分解能を上げる→基本周波数を低くする→長時間のデータをとる→tが大きくなるようにLsを大きくする
ことでダイナミックレンジを広くとることができます。 トレードオフでデータ量が大きくなるので、計算に時間がかかるようになります。
Weitere Antworten (0)
Siehe auch
Kategorien
Mehr zu パルスと遷移の計量 finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!