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

2011-6-14 15:05 2415 7 7 分类: 测试测量
http://www.chinavib.com/forum/thread-55042-1-82.html



语音信号分析:
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);


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

楼主又问: 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);

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

--------------------------------

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

-----------------------------
那具体应该考虑哪些呢
现在是考虑比较短的信号,主要是功能的实现问题,请教高手……
那些参数应该怎么理解?程序你看是不是有什么错误……
这是实验内容,我感觉似乎有些不对,但是又找不出来……
--------------------------------
1,FFT是适用于稳态信号的分析方法,而语音信号不是稳态信号,只是准稳态信号,因此用FFT处理语音信号是不合适的。一般对语音的分析都是分段处理,取每段长为20ms左右;
2,对于语音信号中最重要的信息是基频和共振峰,提取基频和共振峰有许多方法,而重构实际上便是语音的合成,在不少书中都介绍了基本的方法。
--------------------------------
麻烦推荐几本相关书籍,我现在资料比较欠缺……
我是新手,给点建议,指下方向……
现在主要是信号处理基础,用matlab实现……
--------------------------------
如果楼主是做语音信号数字处理的话,一方面要对语音的特点有所了解,还需掌握数字信号处理的方法。有关语音信号处理的书有:
赵力编著,语音信号处理,北京机械工业出版社
易克初等,语音信号处理,国防工业出版社
杨行俊等,语音信号数字处理,电子工业出版社
----------------------------

文章评论0条评论)

登录后参与讨论
我要评论
0
7
关闭 站长推荐上一条 /2 下一条