声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2669|回复: 12

[FFT] 语音信号分析:长信号的快速傅立叶变换

[复制链接]
发表于 2007-11-20 16:53 | 显示全部楼层 |阅读模式

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

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

x
语音信号分析:
wav文件的一次性傅里叶变换 :

选择一个wav文件作为分析的对象,利用一次性傅里叶变换对该文件的第一个声道进行频谱分析,并根据分析的结果进行信号重构,比较重构的信与原信号的区别,并说明原因.
参考程序:
%第一步选定声音文件


[x,fs,bits]=wavread('ding.wav');
%第二步选定声音文件的第一个声道
y=x(:,1);
subplot(311),plot(y);title('第一声道波形')
%求出其长度
L=size(y);
%求出傅立叶变换的最小点数,应大于数据长度
for i=1:100;

if
L<2^i;

break

end
end
N=2^i
%快速傅立叶变换求频谱
k=fft(y,N);
subplot(312),plot(abs(k));title('原频谱图')


%信号重构,求第一个主峰的频率及幅度
[m1,n]=max(abs(k));
f1=(n/N)*fs;
%求第二个主峰的频率及幅度
[m2,n]=max(abs(k(4000:5000)));
f2=((4000+n))/N*fs;
%信号重构,利用傅立叶变换的三角形式
t=[0:0.0001:1];
p=[sin(2*pi*f1*t)+sin(2*pi*f2*t)*(m2/m1)]*0.18;
subplot(313),plot(p);title(‘重构后的波形图')
sound(x,fs,bits);%听原声音
pause
%按任意键听重构后的声音

sound(p,10000);


以上是程序内容,不知是否正确,得出的声音明显感觉失真,请各位高手请教原因,最好有程序注释,以便理解……
谢谢……

[ 本帖最后由 寻找鱼的水 于 2007-11-20 16:57 编辑 ]
回复
分享到:

使用道具 举报

 楼主| 发表于 2007-11-20 16:56 | 显示全部楼层

WAV文件的分段傅立叶分析

WAV文件的分段傅立叶分析
    由于在实际的应用中,DSP处理的数据长度不可能很大,一般只有1000点左右,因此,当要处理的数据较长时,应采用分段傅立叶变换。
1)用1024点对ding.wav文件进行分段傅立叶变换,再重构与合成
2)用1024点对ding.wav文件进行分段傅立叶变换,再利用傅立叶反变换进行合成

请高手进行帮忙:理解各参数的意义;
完成WAV文件的另一个声道的分段傅立叶分析


[w,fs,bits]=wavread('ding.wav');
v=w(:,1);
k=length(v);
N=1024;
n=ceil(k/N);
z=zeros(n,N);
for i=1:n-1;

z(i,:)=(fft(v((N*(i-1)+1):N*i),N))';
end
z(n,:)=(fft(v(N*(n-1)+1:k),N))';
[x,y]=meshgrid(1:n,1:200);
figure(1),plot3(x,y,abs(z(:,1:200)'));
[m,i]=max(abs(z(:,1:200)'));
[m2,i2]=max(abs(z(:,100:200)'));
i2=i2+100;
t=[1:N]*fs;
for j=1:n;

u(N*j-N+1:N*j)=m(j)*sin(i(j)/N*fs*t)+m2(j)*sin(i2(j)/N*fs*t);
end


u1=u* max(v) / max(m);
figure(2),plot(u1(1:2:k));
for L=2:n;

u(N*L-N+1:N*L)=Linspace(m(L-1),m(L),N).*sin(i(L)/N*fs*t)+...

Linspace(m2(L-1),m2(j),N).*sin(i2(L)/N*fs*t);
end
u2=u* max(v) / max(m);
figure(3),plot(u2(1:2:k));
for s=1:n;

u(N*s-N+1:N*s)=fliplr(real(ifft(z(s,:),N)));

end

figure(4), plot(u);

sound(u1,fs,bits);

pause

sound(u2,fs,bits);

pause
sound(u,fs,bits);
pause
sound(w,fs,bits);

感觉程序有误,请高手解救,和上面是同一个内容的.

[ 本帖最后由 eight 于 2007-11-20 17:24 编辑 ]
发表于 2007-11-20 17:10 | 显示全部楼层
1.直接FFT法得到谱峰参数很不准确
2.原始的信号恐怕也不止只有两个谱峰,仅用两个重构肯定有问题
3.采用这种非分段时重构,声音的非平稳性体现在何处?
 楼主| 发表于 2007-11-20 21:53 | 显示全部楼层

回复 #3 VibrationMaster 的帖子

那具体应该考虑哪些呢
现在是考虑比较短的信号,主要是功能的实现问题,请教高手……
那些参数应该怎么理解?程序你看是不是有什么错误……
这是实验内容,我感觉似乎有些不对,但是又找不出来……
发表于 2007-11-21 09:52 | 显示全部楼层
1,FFT是适用于稳态信号的分析方法,而语音信号不是稳态信号,只是准稳态信号,因此用FFT处理语音信号是不合适的。一般对语音的分析都是分段处理,取每段长为20ms左右;
2,对于语音信号中最重要的信息是基频和共振峰,提取基频和共振峰有许多方法,而重构实际上便是语音的合成,在不少书中都介绍了基本的方法。
 楼主| 发表于 2007-11-21 18:25 | 显示全部楼层

回复 #5 songzy41 的帖子

麻烦推荐几本相关书籍,我现在资料比较欠缺……
我是新手,给点建议,指下方向……
现在主要是信号处理基础,用matlab实现……
发表于 2007-11-22 08:37 | 显示全部楼层
如果楼主是做语音信号数字处理的话,一方面要对语音的特点有所了解,还需掌握数字信号处理的方法。有关语音信号处理的书有:
赵力编著,语音信号处理,北京机械工业出版社
易克初等,语音信号处理,国防工业出版社
杨行俊等,语音信号数字处理,电子工业出版社

评分

1

查看全部评分

 楼主| 发表于 2007-11-22 18:10 | 显示全部楼层
关注中……
请发表见解,互相借鉴……
程序中间是否有问题,请高手指点……
发表于 2013-3-31 16:03 | 显示全部楼层

你好。您看这个信号。振动频率28hz ,采样频率1000hz,这是大约 约0.5秒信号.jpg 0.5秒内 的信号。算稳态么?
发表于 2013-3-31 17:23 | 显示全部楼层
本帖最后由 hcharlie 于 2013-3-31 20:13 编辑
长风 发表于 2013-3-31 16:03
你好。您看这个信号。振动频率28hz ,采样频率1000hz,这是大约0.5秒内 的信号。算稳态么?

实际测量的信号,很少有绝对稳态的,你这个信号几个主要频率成分可以说是非常接近于稳态了,用DFT或FFT处理非常合适,注意要取整数个周期的数据,看起来曲线是首尾相接的(如下图),得到的频率幅度比较准确了。
你这个不算稳态,实际中就没有稳态了。
由于还不是绝对稳态,所以误差难免了,你的情况误差不会大。

约0.5秒信号.jpg


发表于 2013-4-1 00:42 | 显示全部楼层
hcharlie 发表于 2013-3-31 17:23
实际测量的信号,很少有绝对稳态的,你这个信号几个主要频率成分可以说是非常接近于稳态了,用DFT或FFT处 ...

谢谢您的指点。您说的证周期个数据。是说采集周期还是振动周期。比如振动频率28hz ,采样频率1000hz。应该是1000的整倍数,还是1000/28的整倍数个数据?
还有,您看这个帖子中有关滤波的问题,信号滤波和积分,如何去除趋势相等
http://forum.chinavib.com/forum. ... &fromuid=191701
谢谢您的指点。
发表于 2013-4-1 09:29 | 显示全部楼层
长风 发表于 2013-4-1 00:42
谢谢您的指点。您说的证周期个数据。是说采集周期还是振动周期。比如振动频率28hz ,采样频率1000hz。应该 ...

整数倍的振动周期,如我给的修改了你的图。
发表于 2013-4-1 09:49 | 显示全部楼层
hcharlie 发表于 2013-4-1 09:29
整数倍的振动周期,如我给的修改了你的图。

好的,谢谢。
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-6-15 06:29 , Processed in 0.096462 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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