寻找鱼的水 发表于 2007-11-20 16:53

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

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

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


=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('原频谱图')


%信号重构,求第一个主峰的频率及幅度
=max(abs(k));
f1=(n/N)*fs;
%求第二个主峰的频率及幅度
=max(abs(k(4000:5000)));
f2=((4000+n))/N*fs;
%信号重构,利用傅立叶变换的三角形式
t=;
p=*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文件的另一个声道的分段傅立叶分析


=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))';
=meshgrid(1:n,1:200);
figure(1),plot3(x,y,abs(z(:,1:200)'));
=max(abs(z(:,1:200)'));
=max(abs(z(:,100:200)'));
i2=i2+100;
t=*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 编辑 ]

VibrationMaster 发表于 2007-11-20 17:10

1.直接FFT法得到谱峰参数很不准确
2.原始的信号恐怕也不止只有两个谱峰,仅用两个重构肯定有问题
3.采用这种非分段时重构,声音的非平稳性体现在何处?

寻找鱼的水 发表于 2007-11-20 21:53

回复 #3 VibrationMaster 的帖子

那具体应该考虑哪些呢
现在是考虑比较短的信号,主要是功能的实现问题,请教高手……
那些参数应该怎么理解?程序你看是不是有什么错误……
这是实验内容,我感觉似乎有些不对,但是又找不出来……

songzy41 发表于 2007-11-21 09:52

1,FFT是适用于稳态信号的分析方法,而语音信号不是稳态信号,只是准稳态信号,因此用FFT处理语音信号是不合适的。一般对语音的分析都是分段处理,取每段长为20ms左右;
2,对于语音信号中最重要的信息是基频和共振峰,提取基频和共振峰有许多方法,而重构实际上便是语音的合成,在不少书中都介绍了基本的方法。

寻找鱼的水 发表于 2007-11-21 18:25

回复 #5 songzy41 的帖子

麻烦推荐几本相关书籍,我现在资料比较欠缺……
我是新手,给点建议,指下方向……
现在主要是信号处理基础,用matlab实现……

songzy41 发表于 2007-11-22 08:37

如果楼主是做语音信号数字处理的话,一方面要对语音的特点有所了解,还需掌握数字信号处理的方法。有关语音信号处理的书有:
赵力编著,语音信号处理,北京机械工业出版社
易克初等,语音信号处理,国防工业出版社
杨行俊等,语音信号数字处理,电子工业出版社

寻找鱼的水 发表于 2007-11-22 18:10

关注中……
请发表见解,互相借鉴……
程序中间是否有问题,请高手指点……

长风 发表于 2013-3-31 16:03

songzy41 发表于 2007-11-21 09:52 static/image/common/back.gif
1,FFT是适用于稳态信号的分析方法,而语音信号不是稳态信号,只是准稳态信号,因此用FFT处理语音信号是不合 ...

你好。您看这个信号。振动频率28hz ,采样频率1000hz,这是大约0.5秒内 的信号。算稳态么?

hcharlie 发表于 2013-3-31 17:23

本帖最后由 hcharlie 于 2013-3-31 20:13 编辑

长风 发表于 2013-3-31 16:03 static/image/common/back.gif
你好。您看这个信号。振动频率28hz ,采样频率1000hz,这是大约0.5秒内 的信号。算稳态么?
实际测量的信号,很少有绝对稳态的,你这个信号几个主要频率成分可以说是非常接近于稳态了,用DFT或FFT处理非常合适,注意要取整数个周期的数据,看起来曲线是首尾相接的(如下图),得到的频率幅度比较准确了。
你这个不算稳态,实际中就没有稳态了。
由于还不是绝对稳态,所以误差难免了,你的情况误差不会大。




长风 发表于 2013-4-1 00:42

hcharlie 发表于 2013-3-31 17:23 static/image/common/back.gif
实际测量的信号,很少有绝对稳态的,你这个信号几个主要频率成分可以说是非常接近于稳态了,用DFT或FFT处 ...

谢谢您的指点。您说的证周期个数据。是说采集周期还是振动周期。比如振动频率28hz ,采样频率1000hz。应该是1000的整倍数,还是1000/28的整倍数个数据?
还有,您看这个帖子中有关滤波的问题,信号滤波和积分,如何去除趋势相等
http://forum.chinavib.com/forum.php?mod=viewthread&tid=125047&fromuid=191701
谢谢您的指点。

hcharlie 发表于 2013-4-1 09:29

长风 发表于 2013-4-1 00:42 static/image/common/back.gif
谢谢您的指点。您说的证周期个数据。是说采集周期还是振动周期。比如振动频率28hz ,采样频率1000hz。应该 ...

整数倍的振动周期,如我给的修改了你的图。

长风 发表于 2013-4-1 09:49

hcharlie 发表于 2013-4-1 09:29 static/image/common/back.gif
整数倍的振动周期,如我给的修改了你的图。

好的,谢谢。
页: [1]
查看完整版本: 语音信号分析:长信号的快速傅立叶变换