声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2201|回复: 3

[FFT] 怎样求功率谱?我编的程序怎么不对,大家帮忙看看

[复制链接]
发表于 2006-9-21 21:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
计算原始信号的功率谱
把声频信号s(i)分帧,每帧长度为512。采样频率为44.1Hz,则信号功率谱密度的计算公

式为10*log(abs(h(i).*s(i)'.*exp(-j*2*pi*k*n/N)/N)^2);

在做这个算法的时候我的程序是这样的,但是结果是不对,大家帮忙看看吧,是那里的问题,谢谢了
clear  all;
close all;
sp=wavread('a');
N=512;T=fix(length(sp)/N);%分帧
s=zeros(1,N);
h=hanning(N);
sum=0;j=sqrt(-1);
for p=1:T   
    s=sp((p-1)*N+1:p*N);   
    for k=1:N        
        for i=1:N         
            sum=sum+h(i)*s(i)*exp(-j*2*pi*k*i/N);     
        end        
        sum=abs(sum);     
        x(k)=20*log10(sum);   
    end   
    result(:,p)=x';
end

原题

原题
回复
分享到:

使用道具 举报

发表于 2006-9-22 17:52 | 显示全部楼层
1,在程序中主要的错是sum=0放错了位置,应把该语句放在二层for之间:
    for k=1:N
        sum=0;
        for i=1:N  
而在公式中Σ以后的算式实际上就是计算DFT(h*s的DFT),因此计算速度特慢。
2,程序中的DFT运算可用FFT去替代:
for p=1:T
    s=sp((p-1)*N+1:p*N);
    x=fft(h.*s);
    x=20*log10(abs(x));
    result(:,p)=x;
end
这样运算速度可快多了,得到是结果是一样的。

[ 本帖最后由 songzy41 于 2006-9-22 17:54 编辑 ]

评分

1

查看全部评分

发表于 2006-9-24 10:46 | 显示全部楼层
问一个相关的问题,我在做能量普密度的时候,为什么最后得出的都是负值?这样合理吗?
[audio_data,fs,nbits]=wavread('d:/audio/test48_double.wav');
siz=wavread('d:/audio/test48_double.wav','size');
w=audio_data';
s=w([1:1],:);
N=1024;
h=hanning(N);
j=sqrt(-1);
S=s(1:N);
S=s(1:N);  
for k=1:1:512
    sum=0;
  for m=1:1:N
    tmp1=h(m)*S(m)*exp(-j*2*pi*k*m/N);  
    sum=tmp1+sum;
  end
   x(k)=(abs(sum/N))^2;
   X(k)=10*log10(x(k));
end
发表于 2006-9-25 09:23 | 显示全部楼层
正如yangzj在另一帖子中对你的程序所说,由于取了对数,功率谱密度有可能是负值。同时在你的运算中用DFT,而实际上可用FFT,运算速度快了很多,精度一样。
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-12-26 22:34 , Processed in 0.091293 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表