⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 完整程序.txt

📁 可用于对信号的频谱进行分析,希望站长能整理好,以便大家互相学习
💻 TXT
字号:
function [x1,x2]=ppvad(v)

[v,fs,bits] = wavread('qq');    %读取录音文件
x=v+randn(size(v))/200;      %加噪后的语音信号 
%将幅度归一化到[-1,1]
x=double(x);
x=x/max(abs(x));
%设定帧长为300帧移为100
framelen=300;
frameinc=100;
amp1=10.8;
amp2=6;
zcr1=12;
zcr2=8;
maxsilence=3;   %3*10ms =30ms
minlen=15;      %15*10ms=150ms
status=0;
count=0;
silence=0;

%计算过零率
temp1=enframe(x(1:length(x)-1),framelen,frameinc);
temp2=enframe(x(2:length(x)),framelen,frameinc);
signs=(temp1.*temp2)<0;
diffs=(temp1-temp2)>0.025;
zcr=sum(signs.*diffs,2);
%计算短时能量
w=filter([1 -0.9375], 1, x)
amp = sum(abs(enframe(w, framelen, frameinc)), 2);

%调整能量门限
amp1=min(amp1,max(amp)/4);
amp2=min(amp2,max(amp)/8);
A=zcr
%开始零点检测主程序
x1=0;
x2=0;
for n=1:length(zcr)
    goto=0;
    switch status
        case{0,1}                              %静音=0,开始=1
            if amp(n)>amp1                        %确信进入语音阶段
                x1=max(n-count-1,1);
                status=2;
                silence=0;
                count=count+1;
           
            elseif amp(n)>amp2|...                %可能处在语音段
                    zcr(n)>zcr2
                status=1;
                count=count+1;
            else                                %静音状态
                status=0;
                count=0;
            end
        case 2,                                   % 语音段
            if amp(n)>amp2|...                 %保持在语音段
                    zcr(n)>zcr2;
                count=count+1;
            else                              %语音将结束
                silence=silence+1;
                  if silence<maxsilence     %静音不够长,,没有结束
                    count=count+1;
                elseif count<minlen;      %语音长度太短,,认为是噪声
                    status=0;
                    silence=0;
                    count=0;
                else 
                    status=3;
                end
            end
        case 3,
            break;
    end
 
count=count-silence/2;
x2=x1+count-1;

figure(1)
%n——x(n)图:
subplot(311)
plot(x,'color','red');  
grid;
axis([1 length(x) -1 1])
ylabel('speech--x(n):'); 
xlabel('n');
line([x1*frameinc x1*frameinc],[-1,1],'color','yellow');
line([x2*frameinc x2*frameinc],[-1,1],'color','yellow');

%短时能量
subplot(312)
plot(amp);  
grid;
axis([1 length(amp) 0 max(amp)])
ylabel('energy');
line([x1,x1],[min(amp),max(amp)],'color','red');
line ([x2 x2],[min(amp),max(amp)],'color','red');

%过零率
subplot(313)
plot(zcr);
grid;
axis([1 length(zcr) 0 max(zcr)])
ylabel('zcr');
line([x1 x1],[min(zcr),max(zcr)],'color','green');
line([x2 x2],[min(zcr),max(zcr)],'color','green');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%滤波函数:

[p,fs,bits] = wavread('2');   %再次读取录音文件
p=p';
s=randn(size(p))/20;
x=p+s;
wavplay(x,fs);
h=length(x);
figure(10)
subplot(311)
plot(1:h,x)
title('带噪信号');

%开始滤波
x=p'
%系数选择
d=input('**********************请输入参数 d=');
w=[0,d];
u=0.0026;
for i=1:length(x)-1;
y(i+1)=s(i:i+1)*w';
e(i+1)=x(i+1)-y(i+1);
w=w+2*u*e(i+1)*s(i:i+1);
end;
wavplay(e,fs);   %回放函数

%打印波形图
subplot(312)
plot(1:h,p)
title('纯净的语音信号');
subplot(313)
plot(1:h,e)
title('滤波后的信号');

%%%%——————————————————————————————

function  [y,f]=xxx(x)
[x,fs,bits] = wavread('qq');
wavplay(x,fs);
h=randn(size(x))/200;
k=x+h;
title('Frequency content of y')
figure(22)
y=k;
z=fft(y);
Py = z.* conj(y) / 512;
f = 1000*(0:256)/512;
plot(f,abs(Py(1:257)));
grid;
xlabel('frequency (Hz)')
end




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -