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);
am=sum(abs(yy),2);
还是先对每个采样点求和,再求幅值呢?
am=abs(sum(yy,2));

相应的功率也存在同样的问题:
先对每个采样点求幅值,求功率,再求和?
= 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 编辑 ]

playtree 发表于 2006-12-10 19:41

可能是我的问题很简单
但是我真的没清楚
所以希望大家不啬指点
谢谢

songzy41 发表于 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,为什么要对幅值求和,有什么物理意义?

playtree 发表于 2006-12-11 14:04

第一个问题:我是在分帧的基础上进行求fft的
第二个问题:我是想求每帧功率谱,所以想在清楚幅值的基础上,求取功率
谢谢

songzy41 发表于 2006-12-11 15:12

原帖由 playtree 于 2006-12-11 14:04 发表
第一个问题:我是在分帧的基础上进行求fft的

“在分帧的基础上进行求fft”,是对每一帧进行FFT,还是对整个f进行2维的FFT?对每一帧进行FFT实际上是stft,而2维的FFT又是语音的什么呢?

playtree 发表于 2006-12-11 15:31

那现在简单的说:在分帧后,对每帧进行如何求其幅值呢?
因为在频谱流的计算时,就是要计算每帧之间的幅值差
谢谢

songzy41 发表于 2006-12-11 20:47

f是分帧以后的数据,可用yy=fft(f')来计算每一帧的FFT值。因为从wav文件读人的数据往往是一列数组,把列变成行的形式,故作了转置。在yy中是一个2维数组,不同行是代表不同的时间,一行是一组谱值。这样既可比较不同时间时的幅值情况,又能进一步求每一帧的功率密度和功率。

playtree 发表于 2006-12-12 14:34

谢谢你的回答
但是有个问题
是yy=fft(f')还是yy=fft(f')‘呢
因为你说的yy中是一个2维数组,不同行是代表不同的时间,一行是一组谱值
所以我个人认为应该是yy=fft(f')‘,这样才能实现不同行是代表不同的时间,一行是一组谱值
因为原先t是一行代表一帧,yy=fft(f')转置后一列代表一帧,再yy=fft(f')‘转置才能是一行是一组谱值
不知道对否

playtree 发表于 2006-12-14 21:07

谢谢你的回答
但是有个问题
是yy=fft(f')还是yy=fft(f')‘呢
因为你说的yy中是一个2维数组,不同行是代表不同的时间,一行是一组谱值
所以我个人认为应该是yy=fft(f')‘,这样才能实现不同行是代表不同的时间,一行是一组谱值
因为原先t是一行代表一帧,yy=fft(f')转置后一列代表一帧,再yy=fft(f')‘转置才能是一行是一组谱值
不知道对否

songzy41 发表于 2006-12-15 08:30

是可以这样。我稍修改了以上的程序,以求每帧幅值和及功率,并用imagesc函数作出谱图:
= wavread('1.wav');
win=fs*20/1000;%
inc=win*0.5;   %
f=enframe(x,hanning(win),inc);
yy=fft(f')';
=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);

playtree 发表于 2006-12-15 08:56

谢谢你
页: [1]
查看完整版本: 求助:求幅值时的困惑