matlab处理语音信号(1)-短时处理

语音信号是一个非稳态的、时变的信号。

短时,是指10ms-30ms,在短时分析中,将语音信号分为一段一段地来分析其特征参数,其中每一段称为一"帧",帧长一般取10~30 ms。这样,对于整体的语音信号来讲,每一帧特征参数组成了特征参数时间序列。

1、读入wav数据

输入参数wavFilename是指以.wav为扩展名的音频文件名称。

输出参数:y是数字化的音频信号;fs是采样频率;nbits是每个样点在编码时的二进制位数(比特数)

function frameTime=frame2time(frameNum,framelen,inc,fs)
% 分帧后计算每帧对应的时间
frameTime=(((1:frameNum)-1)*inc+framelen/2)/fs;

2、分幁

产生重叠:在两个不重叠的帧之间插一些帧来提取特征参数,这就形成了相邻帧之间有重叠部分, 

设读入语音文件的数据存放在y中,y长为N,采样频率为f,取每帧长为wlen,后一帧对前一帧的位移量(简称为帧移)用inc表示

 

输入参数: x是语音信号;win是帧长或窗函数,若为窗函数,帧长便取窗函数长;inc是帧移。

输出参数:f是分帧后的数组,将为帧数×帧长。f x L

function f=enframe(x,win,inc)

nx=length(x(:));            % 取数据长度
nwin=length(win);           % 取窗长
if (nwin == 1)              % 判断窗长是否为1,若为1,即表示没有设窗函数
   len = win;               % 是,帧长=win
else
   len = nwin;              % 否,帧长=窗长
end
if (nargin < 3)             % 如果只有两个参数,设帧inc=帧长
   inc = len;
end
nf = fix((nx-len+inc)/inc); % 计算帧数
f=zeros(nf,len);            % 初始化
indf= inc*(0:(nf-1)).';     % 设置每帧在x中的位移量位置
inds = (1:len);             % 每帧数据对应1:len
f(:) = x(indf(:,ones(1,len))+inds(ones(nf,1),:));   % 对数据分帧
if (nwin > 1)               % 若参数中包括窗函数,把每帧乘以窗函数
    w = win(:)';            % 把win转成行数据
    f = f .* w(ones(nf,1),:);  % 乘窗函数
end

常用三种窗函数

 

 

3、时域分析

能量:

 应用:

平均幅度

 应用:

平均过零率

短时平均过零率表示一帧语音中语音信号波形穿过横轴(零电平)的次数

 应用:

在实际计算短时平均过零率参数时,需要十分注意的一个问题是,如果输入信号中包含漂移,即信号在通往AD转换器前就有一个直流分量,使AD转换后继续带有这个直流分量。因为直流分量的存在影响了短时平均过零率的正确估算,所以建议在语音信号处理前先消除直
流分量。



频域:

stft 短时傅里叶变换

function d=stftms(x,win,nfft,inc)
if length(win)==1          % 判断有否设置窗函数
    wlen=win;              % 否,设帧长
    win=hanning(wlen);     % 设置窗函数
else
    wlen=length(win);      % 设帧长
end
x=x(:); win=win(:);        % 把x和win都变为列数组
s = length(x);             % 计算x的长度

c = 1;
d = zeros((1+nfft/2),1+fix((s-wlen)/inc));   % 初始化输出数组
 
for b = 0:inc:(s-wlen)           % 设置循环
  u = win.*x((b+1):(b+wlen));    % 取来一帧数据加窗
  t = fft(u,nfft);               % 进行傅里叶变换
  d(:,c) = t(1:(1+nfft/2));      % 取1到1+nfft/2之间的谱值
  c = c+1;                       % 改变帧数,求取下一帧
end;

短时功率谱密度 

function [Pxx] = pwelch_2(x, nwind, noverlap, w_nwind, w_noverlap, nfft)
% 计算短时功率谱密度函数
% x是信号,nwind是每帧长度,noverlap是每帧重叠的样点数
% w_nwind是每段的窗函数,或相应的段长,
% w_noverlap是每段之间的重叠的样点数,nfft是FFT的长度

x=x(:);
inc=nwind-noverlap;       % 计算帧移
X=enframe(x,nwind,inc)';  % 分帧
frameNum=size(X,2);       % 计算帧数
%用pwelch函数对每帧计算功率谱密度函数
for k=1 : frameNum
    Pxx(:,k)=pwelch(X(:,k),w_nwind,w_noverlap,nfft);
end

  • 9
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Matlab是一种常用的数字信号处理工具,可以用于数字语音信号处理。数字语音信号处理的主要目的是对语音信号进行分析、处理和合成,以实现语音识别、语音合成、语音压缩等应用。下面是数字语音信号处理的一些基本步骤和方法: 1. 语音信号的采集和预处理:使用麦克风或其他录音设备采集语音信号,并进行预处理,如去除噪声、滤波等。 2. 语音信号的分:将语音信号分成若干个,每个通常包含20-30ms的语音信号。 3. 短时时域分析:对每个进行时域分析,如计算短时能量、短时过零率等。 4. 短时频域分析:对每个进行频域分析,如计算短时功率谱、短时傅里叶变换等。 5. 数字滤波器设计:设计数字滤波器对语音信号进行滤波,如低通滤波、高通滤波、带通滤波等。 6. 语音信号的合成:将处理后的语音信号进行合成,如使用线性预测编码(LPC)合成、基频线性预测编码(LPF)合成等。 以下是一个matlab数字语音信号处理的例子: ```matlab % 读取wav格式的语音文件 [x, fs] = audioread('test.wav'); % 对语音信号进行预处理,如去除噪声、滤波等 % 将语音信号 frame_len = 256; frame_shift = 128; frames = enframe(x, frame_len, frame_shift); % 对每个进行时域分析 frame_energy = sum(frames.^2, 2); % 对每个进行频域分析 frame_spec = abs(fft(frames, [], 2)); % 设计数字滤波器对语音信号进行滤波 [b, a] = butter(6, [1000 4000]/(fs/2)); filtered_x = filter(b, a, x); % 将处理后的语音信号进行合成 synth_x = lpcsyn(filtered_x, 12); % 绘制语音信号波形图和频谱图 subplot(2, 1, 1); plot(x); title('Waveform'); subplot(2, 1, 2); specgram(x, 512, fs); title('Spectrogram'); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大大U

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值