matlab中正弦的总功率
Total power of sine in matlab
我正在尝试使用 pwelch
或 periodogram
来获取不同频率信号的功率。作为测试,我尝试了一个正弦:
sqrt(2)*sin(x)
应该是1的幂。但是,我的脚本在绘图和总功率中显示了不同的值。我做错了什么,为什么光谱取决于样本数量N
?
clc;
clear all;
fs=1e6;
fn=fs/2;
N=2^12;
df=fs/N;
t=0:1/fs:(N-1)/fs;
nu0=250e3;
nu0=df*floor(nu0/df);
a=sqrt(2);
x=a*sin(2*pi*nu0*t);
[px,f]=pwelch(x,[],0,[],fs);
%[px,f]=periodogram(x,[],[],fs);
semilogy(f,px);
disp(['Total power: ',num2str(sum(px))]);
编辑:澄清我的问题:
我得到了预期的结果:
f=0:df:fn-df;
X=fft(x);
amp=(abs(X)./N).^2;
amp=2*amp(1:N/2);
amp(1)=amp(1)/2;
plot(f,pow2db(amp));
pwelch 和 periodogram 有什么区别?
谢谢!
pwelch
和periodogram
都给出了功率谱密度。要计算 power,您需要 integrate 相对于频率的功率谱密度。用总和近似积分,这意味着您需要将 sum(px)
乘以频率步长:
sum(px) * (f(2)-f(1))
或者使用 trapz
和两个输入来计算积分:
trapz(f, px)
在您使用 pwelch
的示例中,这给出了
>> [px,f]=pwelch(x,[],0,[],fs);
>> sum(px) * (f(2)-f(1))
ans =
1.000000000000001
>> trapz(f, px)
ans =
0.999999999999995
与 periodogram
:
>> [px,f]=periodogram(x,[],[],fs);
>> sum(px) * (f(2)-f(1))
ans =
1.000000000000000
>> trapz(f, px)
ans =
1.000000000000000
我正在尝试使用 pwelch
或 periodogram
来获取不同频率信号的功率。作为测试,我尝试了一个正弦:
sqrt(2)*sin(x)
应该是1的幂。但是,我的脚本在绘图和总功率中显示了不同的值。我做错了什么,为什么光谱取决于样本数量N
?
clc;
clear all;
fs=1e6;
fn=fs/2;
N=2^12;
df=fs/N;
t=0:1/fs:(N-1)/fs;
nu0=250e3;
nu0=df*floor(nu0/df);
a=sqrt(2);
x=a*sin(2*pi*nu0*t);
[px,f]=pwelch(x,[],0,[],fs);
%[px,f]=periodogram(x,[],[],fs);
semilogy(f,px);
disp(['Total power: ',num2str(sum(px))]);
编辑:澄清我的问题: 我得到了预期的结果:
f=0:df:fn-df;
X=fft(x);
amp=(abs(X)./N).^2;
amp=2*amp(1:N/2);
amp(1)=amp(1)/2;
plot(f,pow2db(amp));
pwelch 和 periodogram 有什么区别?
谢谢!
pwelch
和periodogram
都给出了功率谱密度。要计算 power,您需要 integrate 相对于频率的功率谱密度。用总和近似积分,这意味着您需要将 sum(px)
乘以频率步长:
sum(px) * (f(2)-f(1))
或者使用 trapz
和两个输入来计算积分:
trapz(f, px)
在您使用 pwelch
的示例中,这给出了
>> [px,f]=pwelch(x,[],0,[],fs);
>> sum(px) * (f(2)-f(1))
ans =
1.000000000000001
>> trapz(f, px)
ans =
0.999999999999995
与 periodogram
:
>> [px,f]=periodogram(x,[],[],fs);
>> sum(px) * (f(2)-f(1))
ans =
1.000000000000000
>> trapz(f, px)
ans =
1.000000000000000