基于matlab的语音信号处理

news2024/11/22 11:38:01

摘要

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

基于MATLAB的语音信号处理

语音信号的采集

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

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

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

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

语音信号的频谱分析

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

数字滤波器设计

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

各滤波器的设计如下:

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

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

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

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

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

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

    

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

语音变速播放

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

%变速-慢放%

w=0.9;

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

sound(x,M,nbits);

语音倒放

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

回响效果

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

实现男女声转换音效效果

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

总结体会

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

 wp2=2*fp2/Fs; ws2=2*fs2/Fs;rp=1;as=100;

 [N2,wp2]=ellipord(wp2,ws2,rp,as);        

 [B2,A2]=ellip(N2,rp,as,wp2,'high');  %计算高通滤波器模拟滤波器系统函数系数

 y2=filter(B2,A2,x);                    %滤波器软件实现

% 高通滤波器绘图部分%

 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设计的滤波器进行滤波

Y1=fft(y1);

n=0:length(y)-1;

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);

y1=filter(Bz,Az,y);               

Y1=fft(y1);

n=0:length(y)-1;

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;

f=n/N*Fs;   f1=m/M*Fs/0.71;

t=n*T; t1=m*T1;

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);         

    kmpred = km + (xpos - lastxpos);         

    lastxpos = xpos;        

    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

end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2198288.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从0开始linux(9)——进程(1)进程管理

欢迎来到博主的专栏&#xff1a;从0开始linux 博主ID&#xff1a;代码小豪 文章目录 查看进程进程管理PID与PPIDfork函数 在上一篇中我们了解到&#xff1a;当运行程序时&#xff0c;操作系统会将磁盘中的二进制文件读取到内存当中&#xff0c;程序运行到结束的过程称为进程&am…

【C++ 11】auto 自动类型推导

文章目录 【 1. 基本用法 】【 2. auto 的 应用 】2.0 auto 的限制2.1 简单实例2.2 auto 与指针、引用、const2.4 auto 定义迭代器2.5 auto 用于泛型编程 问题背景 在 C11 之前的版本&#xff08;C98 和 C 03&#xff09;中&#xff0c;定义变量或者声明变量之前都必须指明它的…

目标检测YOLO实战应用案例100讲-【目标检测】YOLOV11

目录 前言 算法原理 YOLO发展历程 什么是 YOLO11 YOLOv11 的主要特点 YOLO各版本概览 核心优势: YOLOv11改进方向 YOLOv11功能介绍 YOLOv11关键创新 YOLOv11 指标展示 YOLOV11实验 环境设置 准备数据集 训练模型 验证模型 应用领域 一、智慧交通与自动驾…

【Linux实践】实验八:Shell程序的创建及变量

文章目录 实验八&#xff1a;Shell程序的创建及变量实验目的&#xff1a;实验内容&#xff1a;操作步骤&#xff1a;1. 查看环境变量2. 定义变量AK3. 定义变量AM并比较4. 创建Shell程序 实验八&#xff1a;Shell程序的创建及变量 实验目的&#xff1a; 掌握Shell程序的创建过…

【C++】AVL树的底层以及实现

个人主页 文章目录 ⭐一、AVL树的概念&#x1f389;二、AVL树的性质&#x1f3dd;️三、AVL树的实现1. 树的基本结构2. 树的插入3. 树的旋转• 左单旋• 右单旋• 左右双旋• 右左双旋 &#x1f3a1;四、AVL树的其它功能1. 树的查找2. 树的遍历3. 树的高度4. 树的大小 &#x…

RK3568平台开发系列讲解(I2C篇)i2c 总线驱动介绍

🚀返回专栏总目录 文章目录 一、i2c 总线定义二、i2c 总线注册三、i2c 设备和 i2c 驱动匹配规则沉淀、分享、成长,让自己和他人都能有所收获!😄 i2c 总线驱动由芯片厂商提供,如果我们使用 ST 官方提供的 Linux 内核, i2c 总线驱动已经保存在内核中,并且默认情况下已经…

vulnhub-matrix-breakout-2-morpheus靶机的测试报告

目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、信息搜集 2、Getshell ①nc反弹shell连接 ②Webshell上传 3、提权 ①使用kali自带的poc ②使用msf进行渗透 四、结论 一、测试环境 1、系统环境 渗透机&#xff1a;kali2021.1(19…

项目构建工具

一般面试中被问到的项目构建工具&#xff0c;常常会回答的是Maven 今天大概了解了一下目前项目构建构建有Maven,Ant,Gradle Gradle 是一个构建工具&#xff0c;它是用来帮助我们构建app的&#xff0c;构建包括编译&#xff0c;打包等过程。我们可以为Gradle指定构建规则&…

matlab 相关

1、xcorr 本质上是两个函数做内积运算 相关算法有两种&#xff1a; 在Matlab上既可以 1.用自带的xcorr函数计算互相关&#xff0c;2.通过在频域上乘以共轭复频谱来计算互相关&#xff1b; 网友验证程序 clc;clear;close all; % s1,s2为样例数据 s1 [-0.00430297851562500;-…

攻防世界----->Replace

前言&#xff1a;做题笔记。 下载 查壳。 upx32脱壳。 32ida打开。 先运行看看&#xff1a; 没有任何反应&#xff1f; 猜测又是 地址随机化(ASLR)---遇见过。 操作参考&#xff1a; 攻防世界----&#xff1e;Windows_Reverse1_dsvduyierqxvyjrthdfrtfregreg-CSDN博客 然后…

Spring系列 Bean创建过程

文章目录 初始化时机单例初始化流程getBeandoGetBeangetSingleton(String) 获取单例getSingleton(String, ObjectFactory) 创建单例beforeSingletonCreationcreateBeanafterSingletonCreation 创建 Bean 过程doCreateBeanaddSingletonFactory createBeanInstance 创建 Bean 对象…

医院管理智能化:Spring Boot技术革新

3系统分析 3.1可行性分析 通过对本医院管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本医院管理系统采用JAVA作为开发语言&#xff0c;Spring Boot框…

ctf.bugku - game1

题目来源&#xff1a; game1 - Bugku CTF 访问页面&#xff0c;让玩游戏 得到100分&#xff0c;没拿到flag 查看页面源码&#xff0c; GET请求带有 score、IP、sign 三个参数&#xff0c;最后的flag 应该跟分数有关&#xff1b; 给了score一个99999分数&#xff0c; sign 为 …

STM32编码器接口

一、概述 1、Encoder Interface 编码器接口概念 编码器接口可接收增量&#xff08;正交&#xff09;编码器的信号&#xff0c;根据编码器旋转产生的正交信号脉冲&#xff0c;自动控制CNT自增或自减&#xff0c;从而指示编码器的位置、旋转方向和旋转速度每个高级定时器和通用…

如何录制微课教程?K12教育相关课程录制录屏软件推荐

在当今数字化教育的时代&#xff0c;微课作为一种重要的教学资源&#xff0c;受到了越来越多教师和学生的关注。制作一节优质的微课&#xff0c;录制是关键的环节之一。下面我们将结合相关知识&#xff0c;详细介绍如何录制微课教程。 一、微课录制前的准备 1.教学设计文档编写…

Ultralytics:YOLO11使用教程

Ultralytics&#xff1a;YOLO11使用教程 前言相关介绍前提条件实验环境安装环境项目地址LinuxWindows YOLO11使用教程进行目标检测进行实例分割进行姿势估计进行旋转框检测进行图像分类 参考文献 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多…

题目:圆桌会议

解题思路&#xff1a; 结果的顺序就是原序列的逆序&#xff0c;例如12345就是54321为结果顺序。同时将一个顺序序列&#xff08;非环&#xff09;变成逆序需要的次数为。想要的得到最短的交换次数&#xff0c;只需要将环尽量对半分&#xff0c;然后分别对两部分进行顺序序列变逆…

DAY27||回溯算法基础 | 77.组合| 216.组合总和Ⅲ | 17.电话号码的字母组合

回溯算法基础知识 一种效率不高的暴力搜索法。本质是穷举。有些问题能穷举出来就不错了。 回溯算法解决的问题有&#xff1a; 组合问题&#xff1a;N个数里面按一定规则找出k个数的集合切割问题&#xff1a;一个字符串按一定规则有几种切割方式子集问题&#xff1a;一个N个数…

SeaTunnel如何创建Socket数据同步作业?

本文为Apache SeaTunnel Socket Connector的使用文档&#xff0c;旨在帮助用户快速理解和有效利用Socket Connector&#xff0c;助力用户的应用程序实现高效、稳定的网络通信。 Socket是应用层与TCP/IP协议族之间进行通信的中间软件抽象层&#xff0c;它是网络编程的基础&…

视频怎么做成扫码展示?视频二维码在线做的方法

视频想要快速的分享给其他人&#xff0c;选择生成二维码是一种很方便的形式&#xff0c;其他人只需要扫描二维码就可以在线查看视频&#xff0c;与其他分享方式相比更加的简单、方便。现在日常生活中有很多场景都会有视频二维码的应用&#xff0c;简化了获取视频的流程&#xf…