【问题标题】:finding power spectrum of signal using two approaches使用两种方法找到信号的功率谱
【发布时间】:2016-11-08 21:33:06
【问题描述】:

我正在尝试查找信号的功率谱。信号长度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);

我只是更新代码。我不知道,但是当我添加噪声来表示这两个图看起来发生了变化。

【问题讨论】:

    标签: matlab signal-processing


    【解决方案1】:

    主要问题是reshape 您正在使用每一行作为单独的序列。然而,在移动到第二列之前,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 方法。

    【讨论】:

    • 感谢您的帮助。拜托,我不知道,但是当我在信号中添加噪声时,这两个图看起来发生了变化。我只是更新代码来看看。
    • 我无法重现该问题。从您的代码中删除下面bin 中的所有内容,并将其替换为我发布的代码。 (显然将A 重命名为Y)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-23
    • 2017-10-22
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多