一、首先谢谢老师!问题二按您说的以后解决了,但是我把程序段应用到自己编的程序时出错了, 我的共振峰程序选用的是pr9_3_2的求根法,程序报错是:
Attempted to access U_log(NaN); index must be a positive integer or logical.
Error in test2 (line 95)
P(k)=U_log(m+1);clear;
我的语音是一段鼾声,共振峰找出来有两个,但没法输出具体频率和带宽,走到P(k)=U_log(m+1);clear;就停了。
用另一段具有四个共振峰的音频测试时是成功的。
以下是我自己编的前期处理,不知道是否在这里出了问题,您可以帮我看下吗?包括257帧的问题也找不出来。
clc;
close all;
[FileName,PathName]=uigetfile('*.wav'); %interactive read speech data
dir=[PathName,FileName]; %speech path dir为文件路径
[y_sound,Fs,bit]=wavread(dir); %将音频内容存于y_sound中
y_sound=y_sound(:,1); %考虑到有些音频为双声道,取第一列数据
y_sound2=filter([1 -.99],1,y_sound); % 预加重
wavplay(y_sound2);
y_length=length(y_sound2);
T=0
1/Fs)
y_length-1)/Fs; %声音信号的长度,因为画时域图时默认用采样点数做横轴,故现计算出信号的时间长度。T=1/Fs.0~长度减一,因为以0开头。
%%%%%%%%%%%%分帧%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
wlen=160; % 设置帧长 0.02s*8000=200 10~30ms
inc=80; % 设置帧移 0.01s*8000=80 10~20ms
y_frame=enframe(y_sound,wlen,inc)'; % 分帧,行列互换
fn=size(y_frame,2); % 求帧数
%%%%%%%%%画功率谱图%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
win = hamming(wlen); %信号加窗
y=y_frame(:,3);
nfft=256; %选择其中一帧
[PSD, f] = pwelch(y, win, wlen/2,nfft, Fs, 'onesided'); % [PSD, f] = pwelch(y_sound, win, 256, y_length, Fs, 'onesided');
%[PSD,F] = pwelch(data,windows窗函数,noverlap分段平均时重合的部分(默认50%重合),nfft是fft的点数,fs); % PSD (Power Spectral Density ,Vrms^2/Hz)
figure;
plot(f,10*log(PSD),'k');title('语音信号功率谱图');xlabel('频率/Hz');ylabel('幅值/dB');
grid on;
%%%%%%%%线性预测分析%%%%%%%%%%%%%%%%%%%%%%%%%%
p=12; % LPC的阶数
ar=lpc(y,p); % 线性预测系数,数量为p+1; 已经取好一帧数据 法二: y=x(8001:8000+L);
est_x=filter([0 -ar(2:end)],1,y); % 用LPC求预测估算值 filter(分子,分母,输入序列)分子/分母=滤波系数 在ar前加了一个负号,因为用lpc函数求出的ar系数差一个“-”号,所以用了-ar(2:end)。 H(z)输入为全极点模型,可写成有理分式,b都为0;
err=y-est_x; % 求出预测误差
二、请问由PSD画出的功率谱图和用LPC传递函数lpcar2pf画出的功率谱图是一样的吗?
三、噪声的共振峰一般选取几个呢。
再次感谢老师!麻烦您了