matlab处理语音信号

matlab有处理语音信号的函数wavread,不过已经过时了,现在处理语音信号的函数名称是audioread选取4.wav进行处理(只有4的通道数为1)

利用hamming窗设计滤波器

Ham.m

function [N,h,H,w] = Ham(fp,fs,fc)wp = 2*pi*fp/fc;ws = 2*pi*fs/fc;wc = (ws+wp)/2;dw = ws-wp;N = 8*pi/dw;N = round(N);%向上取整h = fir1(N-1,wc/pi,'low',hann(N));H = fft(h,512);w = 2*(0:511)/512;end

调用函数

clear;clc;[x,Fs] = audioread('4.wav');x = x(1:4096,:);X = fft(x);X = X';

% 设置数字低通滤波器,选汉宁窗fp = 1000;fs =1200;fc = 44100;%抽样频率[N,h,H,w] = Ham(fp,fs,fc);

y = filter(h,1,x);Y = ifft(y);

figure(1)subplot(221)stem(x)title('原信号')subplot(222)stem(y)title('滤波后的信号')subplot(223)stem(abs(X))title('原信号频谱')subplot(224)stem(abs(Y))title('滤波后的信号频谱')

figure(2);stem(0:N-1,h);xlabel('n');ylabel('h(n)');axis([0 N-1 -0.02 0.06]);title('汉宁窗的设计');grid on;

figure(3);subplot(2,1,1);plot(w,20*log10(abs(H)));xlabel('\omega/\pi');ylabel('幅度dB');title('幅度特性');subplot(2,1,2);freqz(h)xlabel('\omega/\pi');ylabel('相位(度)');title('相位特性');

% 播放音频% sound(x,Fs)% sound(y,Fs)

%倒放音频xd=flipud(x);yd=flipud(y);sound(xd,Fs)sound(yd,Fs)

Hamming窗如下

滤波器的频率响应如下

可以看出原波形与处理后的波形(看起来有点怪怪的)

补充:

倒放音频时参考

将数组从上向下翻转 - MATLAB flipud - MathWorks 中国​ww2.mathworks.cn/help/matlab/ref/flipud.html

另外发现在命令行中输入filterDesigner并回车会弹出一个窗口

这样就可以用鼠标点点点,轻松设计滤波器了

5/2补充:

利用filterDesigner

选择第一个滤波器设计函数

保存为Filter_FIR.m

function Hd = Filter_FIR%FILTER_FIR 返回离散时间滤波器对象。

% MATLAB Code% Generated by MATLAB(R) 9.9 and DSP System Toolbox 9.11.% Generated on: 02-May-2023 22:45:33

% Equiripple FIR Lowpass filter designed using the FIRPM function.

% All frequency values are in Hz.Fs = 48000;  % Sampling Frequency

Fpass = 9600;            % Passband FrequencyFstop = 12000;           % Stopband FrequencyDpass = 0.057501127785;  % Passband RippleDstop = 0.0001;          % Stopband Attenuationdens  = 16;              % Density Factor

% Calculate the order from the parameters using FIRPMORD.[N, Fo, Ao, W] = firpmord([Fpass, Fstop]/(Fs/2), [1 0], [Dpass, Dstop]);

% Calculate the coefficients using the FIRPM function.b  = firpm(N, Fo, Ao, W, {dens});Hd = dfilt.dffir(b);

% [EOF]

main.m

clear;clc;[x,Fs] = audioread('4.wav');x = x(1:4096,:);X = fft(x);X = X';

y = filter(Filter_IIR,x);Y = ifft(y);

subplot(221)stem(x)title('原信号')subplot(222)stem(y)title('滤波后的信号')subplot(223)stem(abs(X))title('原信号频谱')subplot(224)stem(abs(Y))title('滤波后的信号频谱')

Matlab语音信号处理程序-f11.m 可以对语音信号的单个字,词进行频率及过零率分析 clc [filename,pathname]=uigetfile; [x,Fs]=wavread; %幅度归一化到[-1,1] x = double; x = x / max); %常数设置 FrameLen = 240; FrameInc = 80; amp1 = 10; amp2 = 2; zcr1 = 10; zcr2 = 5; maxsilence = 3;  % 6*10ms  = 30ms minlen  = 15;    % 15*10ms = 150ms status  = 0; count   = 0; silence = 0; %计算过零率 tmp1  = enframe, FrameLen, FrameInc); tmp2  = enframe  , FrameLen, FrameInc); signs = <0; diffs = >0.02; zcr   = sum; %计算短时能量 amp = sum, FrameLen, FrameInc)), 2); %调整能量门限 amp1 = min/4); amp2 = min/8); %开始端点检测 x1 = 0; x2 = 0; x3=0; x4=0; for n=1:length    goto = 0;    switch status    case {0,1}                   % 0 = 静音, 1 = 可能开始       if amp > amp1          % 确信进入语音段          x1 = max;          status  = 2;          silence = 0;          count   = count 1;       elseif amp > amp2 | ... % 可能处于语音段              zcr > zcr2          status = 1;          count  = count 1;       else                       % 静音状态          status  = 0;          count   = 0;       end    case 2,                       % 2 = 语音段       if amp > amp2 | ...     % 保持在语音段          zcr > 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 end    count = count-silence/2; x2 = x1 count -1; subplot plot axis -1 1]) ylabel; line; line; subplot plot; axis 0 max]) ylabel; line,max], 'Color', 'red'); line,max], 'Color', 'red'); subplot plot; axis 0 max]) ylabel; line,max], 'Color', 'red'); line,max], 'Color', 'red'); 复制代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>