FFTのピーク周波数以外の周波数のレベルを下げることはできますか?
조회 수: 11 (최근 30일)
이전 댓글 표시
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
채택된 답변
Takuji Fukumoto
2018년 2월 13일
편집: Takuji Fukumoto
2018년 2월 14일
まず、下記についてですが、
>ピーク高-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
Takuji Fukumoto
2018년 2월 17일
はい、窓関数の種類によっても変わりますし、 同じ窓関数ノイズフロアを下げる方法としては、
・ノイズを分散させる→高い周波数成分まで利用する→サンプリング周波数Fsを大きくする。
・周波数分解能を上げる→基本周波数を低くする→長時間のデータをとる→tが大きくなるようにLsを大きくする
ことでダイナミックレンジを広くとることができます。 トレードオフでデータ量が大きくなるので、計算に時間がかかるようになります。
추가 답변 (0개)
참고 항목
카테고리
Help Center 및 File Exchange에서 パルスと遷移の計量에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!