使用两种方法找到信号的功率谱

时间:2016-11-08 21:33:07

标签: matlab signal-processing

我试图找到信号的功率谱。信号的长度为100000,采样频率为1000Hz,点数为100000。我用两种方法找到了功率谱。第一种方法是将所有长度作为一个部分并找到它的功率谱,而第二种方法是将信号分成100*1000并找到每行的频谱,然后得到所有行的均值。我的问题是我必须在两种方法中得到相同的答案,但我得到了不同的答案。我不知道代码中的错误是什么。

N=100000;
SF=1000;      
a=0.1;
b=0.3; 
amplitude1=1;
amplitude2=0.5;
t=0:1/SF:100;
f1=SF*a;
f2=SF*b;
A=amplitude1*sin(2*pi*f1*t)+amplitude2*sin(2*pi*f2*t);
Y=2*randn(1,length(A))+A;
bin=[0 :N/2];
fax_Hz=(bin*SF)/N;
FFT=fft(Y);
spectra=2/(SF*length(Y))*(FFT.*conj(FFT));
plot(fax_Hz,spectra(1,1:50001));
D=reshape(Y(1,1:100000),[100,1000]);
M=length(D(1,:));
for i=1:100
    FFT_1(i,:)=fft(D(i,:));
    S(i,:)=(2/(SF*M))*(FFT_1(i,:).*conj(FFT_1(i,:)));
end
S_f=mean(S);
figure
plot (S_f);

我只是更新代码。我不知道,但当我添加噪音信号时,两个情节看起来移位了。

1 个答案:

答案 0 :(得分:1)

主要问题是reshape您正在处理每一行是一个单独的序列。然而,在转移到第二列之前,重塑形状会填充第一列。

您可以改用以下内容。

D=reshape(A(1,1:100000),[1000,100]).';

标准化是另一个问题。您可以使用ifft代替fft,因为默认情况下会对其进行规范化(不确定原因)。或者保持规范化,而不是使用mean,您应该使用sum,这可能是由于您可能犯了错误。幅度似乎仍然存在微小的差异,不确定它的来源。

在绘图结束时使用以下内容:

bin=[0 :N];
fax_Hz=(bin*SF)/N;
FFT=ifft(A);
spectra=FFT.*conj(FFT);
plot(fax_Hz,spectra); hold on
D=reshape(A(1,1:100000),[1000,100]).';
M=length(D(1,:));
for i=1:100
    FFT_1(i,:)=ifft(D(i,:));
    S(i,:)=FFT_1(i,:).*conj(FFT_1(i,:));
end
S_f=mean(S);
plot(fax_Hz(1:100:end-1), S_f);

注意:fax_Hz(1:100:end-1)是一种让矢量长度相同的hacky方式。