基于matlab的语音信号处理

这篇具有很好参考价值的文章主要介绍了基于matlab的语音信号处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

摘要

利用所学习的数字信号处理知识,设计了一个有趣的音效处理系统,首先设计了几种不同的滤波器对声音进行滤波处理,分析了时域和频域的变化,比较了经过滤波处理后的声音与原来的声音有何变化。同时设计实现了语音的倒放,变速播放,回响,音调转换等处理效果,其中音调转换部分使用了重新采样改变基频,再进行时长规整的算法。

基于MATLAB的语音信号处理

语音信号的采集

  录制或者截取一段音乐,时间在1分钟左右,存为.wav的文件。然后利用wavread对语音信号进行采样。我们一共选择了3段语音,其中

d.wav 真心英雄(周华健)(男声)

man.wav我的歌声里(自己录制)(男声)

girl.wav看的最远的地方(张韶涵)(女声)

语音信号的频谱分析

使用matlab画出语音信号的时域波形;然后对语音号进行快速傅里叶变换,得到信号的频谱特性,画出频谱图,分析频率成分。这里我们分析的是d.wav,通过分析知道频率分布在0—10KHz,主要分布在低频。

基于matlab的语音信号处理

数字滤波器设计

这里我们设计了4种滤波器对语音进行处理,分别为椭圆低通滤波,椭圆高通滤波,等波纹逼近法FIR带通滤波器,双线性变换法切比雪夫数字高通滤波器,绘制出相应的幅度、相位谱图,滤波后的波形、频谱图。

各滤波器的设计如下:

椭圆低通滤波器:fb=1 200 Hz,fc=1 400 Hz,As=100 dB,Ap=1 dB

基于matlab的语音信号处理
基于matlab的语音信号处理

椭圆高通滤波器:fc=4 800 Hz,fb=5 000 Hz As=100 dB,Ap=1 dB

基于matlab的语音信号处理
基于matlab的语音信号处理

等波纹逼近法设计FIR带通滤波器

fb1=1200Hz,fb2=3000Hz,fc1=1000Hz,fc2=3000Hz,As=100dB,Ap=1dB

基于matlab的语音信号处理
基于matlab的语音信号处理

双线性变换法切比雪夫数字高通滤波器

fc=4 800 Hz,fb=5 000 Hz As=100 dB,Ap=1 dB

基于matlab的语音信号处理
基于matlab的语音信号处理

滤波处理后,我们用函数sound()可以对声音进行回放,调用格式:sound(x,fs,bits);感觉滤波前后的声音。语音的低频部分沉稳,空间感较强;中频部分音质一般;高频部分音质非常尖锐,略微有尖音。此外中高频的幅度都不大,回放时音量较低。

语音变速播放

改变语音的播放速度也就是改变采样间隔(即改变了采样频率),但是这个频实现率依然要在2f(Nyquist rate)之上,否则就会产生失真。

%变速-慢放%

w=0.9;

M=w*fs; %w>1为快放,w<1为慢放

sound(x,M,nbits);

语音倒放

使用flipud()倒置语音矩阵,逆序输出音频即可。

回响效果

回声在时域上幅值减小了,频域上的特征不变,只需要把原信号添加一个延时(delay)和对时域的幅度添加一个参数.然后和原信号叠加即可获得回响效果。

基于matlab的语音信号处理

实现男女声转换音效效果

我们使用另外写的voice(x,f)函数实现音调转换,x为需要转换的声音,通过抽取插值更改采样率来改变基频,当f>1时音调降低;f<1音调升高。然后再进行时长整合使语音文件恢复原来的时长。时长整合使用重叠叠加算法来实现。经过我们试听,转换效果还是很好的。

基于matlab的语音信号处理
基于matlab的语音信号处理

总结体会

通过对声音信号的滤波处理,比较其前后变化,感受到了滤波器在声音信号处理当中的作用,同时在实践中掌握了滤波器的基本设计方法,加深了对各种类型的数字滤波器特性的理解。我们通过对声音的各种变换,产生了多种不同的音效,也体会到了语音处理的魅力。

代码附录

%读取声音信号%

[y,fs,nbits]=wavread('d'); %读取声音文件

x=y(:,1); %读入的y矩阵有两列,取第1列

N=length(x);

n=0:N-1;

X= fft(x); %傅里叶变换

Fs=2*fs; %2倍频

T=1/Fs;

f=n/N*Fs;

figure;

subplot(2,1,1);

plot(n,x); %声音的时域波形

title('原声音的波形');

xlabel('t/s');

ylabel('magnitude');

subplot(2,1,2);

plot(f,abs(X)); %声音的频谱

title('原声音的频谱');

xlabel('frequency/Hz');

ylabel('magnitude');

% 滤波器设计%

% 椭圆低通滤波器%

fp1=1200;fs1=1400; %低通滤波器通带截止频率1200Hz和阻带截止频率1400Hz

wp1=2*fp1/Fs; ws1=2*fs1/Fs;rp=1;as=100;

[N1,wp1]=ellipord(wp1,ws1,rp,as); %计算椭圆低通模拟滤波器的阶数和通带边界频率

[B,A]=ellip(N1,rp,as,wp1); %计算低通滤波器模拟滤波器系统函数系数

y1=filter(B,A,x); %滤波器软件实现

% 低通滤波器绘图部分%

figure;

freqz(B,A);

figure;

subplot(2,1,1);

t=n*T;

plot(t,y1);

xlabel('t/s');ylabel('magnitude');title('低通滤波后的波形');

axis([0,t(end),min(y1),1.2*max(y1)])%坐标范围

subplot(2,1,2);

plot(f,abs(fft(y1)));

%椭圆高通滤波器%

fp2=4800;fs2=5000; %高通滤波器通带截止频率5000Hz和阻带截止频率4800Hz

% 高通滤波器绘图部分%

figure;

freqz(B2,A2);

figure;

subplot(2,1,1);

t=n*T;

plot(t,y2);

xlabel('t/s');ylabel('magnitude');title('高通滤波后的波形');

axis([0,t(end),min(y2),1.2*max(y2)])

subplot(2,1,2);

plot(f,abs(fft(y2)));

%等波纹逼近法设计FIR带通滤波器及滤波

[I,fs,nbits]=wavread('d');

y=I(:,1);

fp1=1200;fp2=3000;fc1=1000;fc2=3200;FS=2*fs;rp=1;rs=100;

f=[fc1,fp1,fp2,fc2];

m=[0,1,0];

dat1=(10^(rp/20)-1)/(10^(rp/20)+1);dat2=10^(-rs/20);

rip=[dat2,dat1,dat2];

[M,fo,mo,w]=remezord(f,m,rip,FS);

M=M+1;

hn=remez(M,fo,mo,w);

figure(1);

freqz(hn);

Y=fft(y);

y1=fftfilt(hn,y); %用remez设计的滤波器进行滤波

figure(2);

subplot(221);plot(y);title('未滤波语音波形');

subplot(222);plot(y1);title('等波纹逼近法滤波后语音波形');

subplot(223);plot(n,Y);title('未滤波语音频谱');

subplot(224);plot(n,Y1);title('等波纹逼近法滤波后语音频谱');

sound(y1,fs,nbits); %滤波后语音回放

%cheby1设计模拟高通滤波器再经双线性变换法设计成数字高通滤波器

fp=5000;fc=4800;rp=1;rs=100;FS=2*fs;

wpz=2*pi*fp/FS;wsz=2*pi*fc/FS;

wp=2*tan(wpz/2)*FS;ws=2*tan(wsz/2)*FS; %预畸校正转换指标

[N,wpo]=cheb1ord(wp,ws,rp,rs,'s');

[BH,AH]=cheby1(N,rp,wpo,'high','s');

[Bz,Az]=bilinear(BH,AH,FS);

w=0:0.01*pi:pi;

[h,w]=freqz(Bz,Az,w);

plot(w/pi,20*log(abs(h)),'k');axis([0,1,-800,100]);

xlabel('w/pi');ylabel('幅度/dB');grid;

title('cheby1数字高通滤波器');

Y=fft(y);

figure(2);

subplot(221);plot(y);title('未滤波语音波形');

subplot(222);plot(y1);title('cheby滤波后语音波形');

subplot(223);plot(n,Y);title('未滤波语音频谱');

subplot(224);plot(n,Y1);title('cheby滤波后语音频谱');

sound(y1,fs,nbits); %滤波后语音回放

%播放声音%

sound(x,fs,nbits); %原声

sound(5*y1,fs,nbits); %低通

sound(5*y2,fs,nbits); %高通

%变速-慢放%

w=0.9;

M=w*fs; %w>1为快放,w<1为慢放

sound(x,M,nbits);

%语音倒放%

y0=flipud(x);

sound(y0);

%回声%

z=[zeros(5000,1);x]; %延时5000个点

x1=[x;zeros(5000,1)]; %使原声音长度与延时后相等

y1=x1+0.4*z; %原声+延时衰减

figure;

plot(y1);

title('加入回声的波形');

sound(5*y1,fs,nbits);

%调用函数voice()实现音调转换%

%男声转换为女声%

[y,fs,nbits]=wavread('man'); %读取声音文件

x=y(:,1); %读入的y矩阵有两列,取第1列

y1=voice(x,0.71); %调整voice()第2个参数转换音调,>1降调,<1升调,y1为x转换后的声音

N=length(x); M=length(y1);

n=0:N-1; m=0:M-1;

X= fft(x); Y=fft(y1); %傅里叶变换

Fs=2*fs; %2倍频

T=1/Fs; T1=1/Fs*0.71;

figure;

subplot(2,1,1);

plot(t,x);

xlabel('t/s');ylabel('magnitude');title('转换前的波形');

subplot(2,1,2);

plot(t1,y1);

xlabel('t/s');ylabel('magnitude');title('转换后的波形');

figure;

subplot(2,1,1);

plot(f,abs(X));

xlabel('frequency/Hz');ylabel('magnitude');title('转换前的频谱');

subplot(2,1,2);

plot(f1,abs(Y));

xlabel('frequency/Hz');ylabel('magnitude');title('转换后的频谱');

sound(y1,fs,nbits);

%女声转换为男声%

[y,fs,nbits]=wavread('girl'); %读取声音文件

x=y(:,1); %读入的y矩阵有两列,取第1列

sound(voice(x,1.3),fs,nbits);

%调整voice()第2个参数转换音调,>1降调,<1升调

function Y=voice(x,f)

%更改采样率使基频改变 f>1降低;f<1升高

f=round(f*1000);

d=resample(x,f,1000);

%时长整合使语音文件恢复原来时长

W=400;

Wov=W/2;

Kmax=W*2;

Wsim=Wov;

xdecim=8;

kdecim=2; X=d';

F=f/1000;

Ss =W-Wov;

xpts = size(X,2);

ypts = round(xpts / F);

Y = zeros(1, ypts);

xfwin = (1:Wov)/(Wov+1);

ovix = (1-Wov):0; newix = 1:(W-Wov);

simix = (1:xdecim:Wsim) - Wsim;

padX = [zeros(1, Wsim), X, zeros(1,Kmax+W-Wov)];

Y(1:Wsim) = X(1:Wsim); lastxpos = 0; km = 0;

for ypos = Wsim:Ss:(ypts-W)

xpos = round(F * ypos);

if (kmpred <= Kmax)

km = kmpred;

else

ysim = Y(ypos + simix);

rxy = zeros(1, Kmax+1);

rxx = zeros(1, Kmax+1);

Kmin = 0;

for k = Kmin:kdecim:Kmax

xsim = padX(Wsim + xpos + k + simix);

rxx(k+1) = norm(xsim);

rxy(k+1) = (ysim * xsim');

end

Rxy = (rxx ~= 0).*rxy./(rxx+(rxx==0));

km = min(find(Rxy == max(Rxy))-1);

end

xabs = xpos+km;

Y(ypos+ovix) = ((1-xfwin).*Y(ypos+ovix)) + (xfwin.*padX(Wsim+xabs+ovix));

Y(ypos+newix) = padX(Wsim+xabs+newix);

end文章来源地址https://www.toymoban.com/news/detail-476813.html

end

到了这里,关于基于matlab的语音信号处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数字信号处理、语音信号处理、现代信号处理

    推荐他的博客: 手撕《数字信号处理》——通俗易懂的数字信号处理章节详解集合 手撕《语音信号处理》——通俗易懂的语音信号处理章节详解集合 手撕《现代信号处理》——通俗易懂的现代信号处理章节详解集合

    2024年02月08日
    浏览(69)
  • 【信号去噪和分类】基于小波的隐马尔可夫模型统计信号处理(Matlab代码实现)

    💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码、数据、文献

    2024年02月16日
    浏览(61)
  • 语音信号处理 —— 笔记(一)音频信号处理

      声音的产生 :能量通过声带使其振动产生一股基声音,这个基声音通过声道 ,与声道发生相互作用产生共振声音,基声音与共振声音一起传播出去。 传感器以 某种频率 探测声音的振幅强度以及振动方向,所得到的一系列随时间变化的点。 传感器的探测频率,即为采样

    2023年04月09日
    浏览(56)
  • 统计信号处理-基于AR模型的卡尔曼滤波股票预测-matlab仿真-附代码

    题目 给出基于AR模型的卡尔曼滤波股票预测。 设计思路 本实验实现的是中兴通讯公司股价预测,使用AR模型预测股价,并将卡尔曼滤波应用到AR模型的预测结果上,对预测的股价进行滤波处理,可以更准确地预测股价趋势。 第一步是加载股票数据,然后将股票数据分为训练数

    2024年02月08日
    浏览(50)
  • 数字信号处理音频FIR去噪滤波器(基于MATLAB GUI的开发)

    利用MATLAB GUI设计平台,用窗函数法设计FIR数字滤波器,对所给出的含有噪声的声音信号进行数字滤波处理,得到降噪的声音信号,进行时域频域分析,同时分析不同窗函数的效果。将文件解压至一个目录下,运行m文件即可使用。 读取.wav音频文件函数 :audioread();(老版

    2024年02月08日
    浏览(56)
  • 135基于matlab的经验小波变换(EWT)的自适应信号处理方法

    基于matlab的经验小波变换(EWT)的自适应信号处理方法.其核心思想是通过对信号的Fourier谱进行自适应划分,建立合适的小波滤波器组来提取信号不同的成分,EWT1D和EWT2D方法。程序已调通,可直接运行。 135matlab信号处理EWT (xiaohongshu.com)

    2024年01月17日
    浏览(43)
  • 162基于matlab的多尺度和谱峭度算法对振动信号进行降噪处理

    基于matlab的多尺度和谱峭度算法对振动信号进行降噪处理,选择信号峭度最大的频段进行滤波,输出多尺度谱峭度及降噪结果。程序已调通,可直接运行。 162 matlab 信号处理 多尺度谱峭度 (xiaohongshu.com)

    2024年02月19日
    浏览(49)
  • 语音识别入门第二节:语音信号处理及特征提取

    目录 数字信号处理基础 基础知识 傅里叶分析 常用特征提取 特征提取流程 Fbank MFCC 模拟信号到数字信号转化(ADC) :在科学和工程中,遇到的大多数信号都是连续的模拟信号,而计算机只能处理离散的信号,因此,必须对这些连续的模拟信号进行转化,通过采样和量化,转

    2024年02月10日
    浏览(45)
  • 数字信号处理8:利用Python进行数字信号处理基础

    我前两天买了本MATLAB信号处理,但是很无语,感觉自己对MATLAB的语法很陌生,看了半天也觉得自己写不出来,所以就对着MATLAB自己去写用Python进行的数字信号处理基础,我写了两天左右,基本上把matlab书上的代码全部用Python实现了,所以,今天贴的代码和图有些多, 要用到的

    2024年02月13日
    浏览(41)
  • c++通过自然语言处理技术分析语音信号音高

            对于语音信号的音高分析,可以使用基频提取技术。基频是指一个声音周期的重复率,也就是一个声音波形中最长的周期。 通常情况下,人的声音基频范围是85Hz到255Hz。根据语音信号的基频可以推断出其音高。         C++中可以使用数字信号处理库或语音处理

    2024年02月14日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包