声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1770|回复: 10

[其他] 求助:求幅值时的困惑

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

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

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

x
将一段语音分帧后,求取每帧的幅值的过程是这样的吗
先对每个采样点求幅值,再求和?
[x,fs,bits] = wavread('F:\code\music\5.wav');
win=fs*20/1000;%
inc=win*0.5;   %
f=enframe(x,hanning(win),inc);
yy=fft(f,[],2);
am=sum(abs(yy),2);
还是先对每个采样点求和,再求幅值呢?
am=abs(sum(yy,2));

相应的功率也存在同样的问题:
先对每个采样点求幅值,求功率,再求和?
[x,fs,bits] = wavread('F:\code\music\5.wav');
win=fs*20/1000;%
inc=win*0.5;   %
f=enframe(x,hanning(win),inc);
yy=fft(f,[],2);
am=sum(abs(yy).^2);
还是先对每个采样点求和,再求幅值,功率呢?
am=abs(sum(yy,2)).^2;

请知道的朋友指点
先谢过

[ 本帖最后由 zhangnan3509 于 2007-7-4 10:58 编辑 ]
回复
分享到:

使用道具 举报

 楼主| 发表于 2006-12-10 19:41 | 显示全部楼层
可能是我的问题很简单
但是我真的没清楚
所以希望大家不啬指点
谢谢
发表于 2006-12-11 08:56 | 显示全部楼层
原帖由 playtree 于 2006-12-9 18:34 发表
将一段语音分帧后,求取每帧的幅值的过程是这样的吗
先对每个采样点求幅值,再求和?
= wavread('F:\code\music\5.wav');
win=fs*20/1000;%
inc=win*0.5;   %
f=enframe(x,hanning(win),inc);
yy=fft(f,[] ,2);

看了楼主的程序,想问二个问题:
1,对语音信号进行了分帧,为了了解每帧的特性,应对每帧进行FFT分析,但楼主为什么要对整个语音信号进行2维的分析--yy=fft(f,[] ,2)?
2,为什么要对幅值求和,有什么物理意义?
 楼主| 发表于 2006-12-11 14:04 | 显示全部楼层
第一个问题:我是在分帧的基础上进行求fft的
第二个问题:我是想求每帧功率谱,所以想在清楚幅值的基础上,求取功率
谢谢
发表于 2006-12-11 15:12 | 显示全部楼层
原帖由 playtree 于 2006-12-11 14:04 发表
第一个问题:我是在分帧的基础上进行求fft的

“在分帧的基础上进行求fft”,是对每一帧进行FFT,还是对整个f进行2维的FFT?对每一帧进行FFT实际上是stft,而2维的FFT又是语音的什么呢?
 楼主| 发表于 2006-12-11 15:31 | 显示全部楼层
那现在简单的说:在分帧后,对每帧进行如何求其幅值呢?
因为在频谱流的计算时,就是要计算每帧之间的幅值差
谢谢
发表于 2006-12-11 20:47 | 显示全部楼层
f是分帧以后的数据,可用yy=fft(f')来计算每一帧的FFT值。因为从wav文件读人的数据往往是一列数组,把列变成行的形式,故作了转置。在yy中是一个2维数组,不同行是代表不同的时间,一行是一组谱值。这样既可比较不同时间时的幅值情况,又能进一步求每一帧的功率密度和功率。
 楼主| 发表于 2006-12-12 14:34 | 显示全部楼层
谢谢你的回答
但是有个问题
是yy=fft(f')还是yy=fft(f')‘呢
因为你说的yy中是一个2维数组,不同行是代表不同的时间,一行是一组谱值
所以我个人认为应该是yy=fft(f')‘,这样才能实现不同行是代表不同的时间,一行是一组谱值
因为原先t是一行代表一帧,yy=fft(f')转置后一列代表一帧,再yy=fft(f')‘转置才能是一行是一组谱值
不知道对否
 楼主| 发表于 2006-12-14 21:07 | 显示全部楼层
谢谢你的回答
但是有个问题
是yy=fft(f')还是yy=fft(f')‘呢
因为你说的yy中是一个2维数组,不同行是代表不同的时间,一行是一组谱值
所以我个人认为应该是yy=fft(f')‘,这样才能实现不同行是代表不同的时间,一行是一组谱值
因为原先t是一行代表一帧,yy=fft(f')转置后一列代表一帧,再yy=fft(f')‘转置才能是一行是一组谱值
不知道对否
发表于 2006-12-15 08:30 | 显示全部楼层
是可以这样。我稍修改了以上的程序,以求每帧幅值和及功率,并用imagesc函数作出谱图:
[x,fs,bits] = wavread('1.wav');
win=fs*20/1000;%
inc=win*0.5;   %
f=enframe(x,hanning(win),inc);
yy=fft(f')';
[n,m]=size(yy);
n2=1:win/2+1;
ff=(n2-1)*fs/win;
imagesc(ff,1:n,abs(yy(:,n2)));
am=sum(abs(yy),2);
zb=abs(yy).^2;
bm=sum(zb,2);
 楼主| 发表于 2006-12-15 08:56 | 显示全部楼层
谢谢你
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-5-22 23:22 , Processed in 0.053996 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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