声音数据输入输出函数:

可以方便地读写au和way文件,并可控制其中的位及频率。

wavread()和wavwriteO。

声音播放:

wavplay():播放wav声音文件。当然,也可以把处理后的

wav文件保存后再用其它工具播放。

wavrecordO:可以对处理后的wav文件进行录音。

PS:在日常生活中,我们听到的声音一般都属于复音,其声音信号由不同的振幅与频率的波合成而得到

分析和处理音频信号 首先要对声音信号进行采集 MATLAB的数据采集工具箱提供了一整套命令和函数,通过调用这些函数和命令,可直接控制声卡进行数据采集[1]

Windows自带的录音机程序也可驱动声卡来采集语音信号 并能保存为WAV格式文件供MATLAB相关函数直接读取

写入或播放 本文以WAV格式音频信号作为分析处理的输入数据 用MATLAB处理音频信号的基本流程是 先将WAV格式音频信号经wavread函数转换成MATLAB列数组变量

再用MATLAB强大的运算能力进行数据分析和处理 如时域分析 频域分析 数字滤波 信号合成 信号变换 识别和增强等等 处理后的数据如是音频数据 则可用wavwrite转换成WAV格式文件或用sound

wavplay等函数直接回放 下面分别介绍MATLAB在音量标准化 声道分离合并与组合 数字滤波 数

据转换等音频信号处理方面的技术实现

录制声音过程中需对声音电平进行量化处理 最理想的量化是最大电平对应最高量化比特 但实际却很难做到 常有音轻问题 利用 MATLAB很容易实现音量标准化 即最大电平对应最高量化比特 基本步骤是 先用wavread函数将WAV文件转换成列数组变量

再求出数组变量的极值并对所有元素作归一化处理 最后用wavwrite函数还原成音量标准化的WAV文件

例 1现以微软自带的Windows XP关机.wav音频信号为例

先将其复制另存到文件名为XPexit.wav的MATLAB当前目录中

再通过音量标准化处理后保存为 XPquit.wav文件 实现程序如下

clear; close all; clc;

[Y,FS,NBITS]=wavread('XPexit.WAV'); % 将WAV文件转换成变量

FS,NBITS, % 显示采样频率和量化比特

Ym=max(max(max(Y)),max(abs(min(Y)))), % 找出双声道极值

X=Y/Ym; % 归一化处理

wavwrite(X,FS,NBITS,'XPquit.wav') % 将变量转换成WAV文件

试听可知标准化处理后音量稍大

立体声或双声道音频信号有左右两个声道 利用 MATLAB实现双声道分离 两路声道合并和两个单声道组合成一个双声道等效果 实际上是利用了MATLAB的矩阵抽取

矩阵相加和矩阵重组运算

例 2现以例1生成的XPquit.wav为例

实现分离 合并和组合处理的程序如下

clear; close all; clc;

[x,FS,NBITS]=wavread('XPquit.WAV'); % 将WAV文件转换成变量

x1=x(:,1); % 抽取第1声道

x2=x(:,2); % 抽取第2声道

wavwrite(x1,FS,NBITS,'XPquit1.WAV'); % 实现1声道分离

wavwrite(x2,FS,NBITS,'XPquit2.WAV'); % 实现2声道分离

%如果合并位置不对前面补0 %声道长度不对后面补0

x12=x1+x2; % 两路单声道列向量矩阵变量合并

x12m=max(max(x12),abs(min(x12))), % 找出极值

y12=x12./x12m; % 归一化处理

wavwrite(y12,FS,NBITS,'XPquit12.WAV'); % 实现两路声道合并

%如果组合位置不对前面补0--声道长度不对后面补0

x3=[x1,x2]; % 两路单声道变量组合

wavwrite(x3,FS,NBITS,'XPquit3.WAV'); % 实现两路声道组合

可以试听声道分离 合并与组合的效果 也可对各文件大小进行比较

数字滤波是常用的音频处理技术 可根据技术指标 先利用 FDATool工具 设计一个数字滤波器[2]再用Filter或Filter2函数即可实现滤波处理

调用的Filter函数格式是Y = filte (B,A,X)其中B和A是滤波器传输函数的分子和分母系数X是输入变量Y是实现滤波后的输出变量

如果处理立体声音频信号 可分开处理 但用FIR滤波器时调用Filter2函数更方便

例 3现以例2生成的XPquit12.wav为例

实现数字滤波的程序如下

clear; close all; clc;

[X,FS,NBITS]=wavread('XPquit12.WAV'); % 将WAV文件转换成变量

%利用FDATool设计一个LowpassButterworth滤波器

%指标FS=22050Hz Fp=1000Hz Ap=1dB Fs=3000Hz As=20dB

B =[0.0062,0.0187,0.0187,0.0062]; % 分子系数

A =[1,-2.1706,1.6517,-0.4312]; % 分母系数

Y=filter(B,A,X); % 实现数字滤波

t=(0:length(X)-1)/FS; % 计算数据时刻

subplot(2,2,1);plot(t,X); % 绘制原波形图

title(' 原信号波形图'); %加标题

subplot(2,2,3);plot(t,Y); % 绘制滤波波形图

title(' 滤波后波形图'); %加标题

xf=fft(X); % 作傅里叶变换求原频谱

yf=fft(Y); % 作傅里叶变换求滤波后频谱

fm=3000*length(xf)/FS; % 确定绘频谱图的上限频率

f=(0:fm)*FS/length(xf); % 确定绘频谱图的频率刻度

subplot(2,2,2);plot(f,abs(xf(1:length(f)))); % 绘制原波形频谱图

title(' 原信号频谱图'); %加标题

subplot(2,2,4);plot(f,abs(yf(1:length(f)))); % 绘制滤波后频谱图

title(' 滤波后信号频谱图'); %加标题

wavwrite(Y,FS,NBITS,'XPquitFilter.WAV'); % 写成WAV文件

程序运行结果如图 1所示 由图可知 滤波对波形影响不大

但对高频有较大衰减 试听会感觉到处理后的声音比较沉闷

数据转换是指改变音频格式中的采样频率或量化位数 转换原理是 先用矩阵插值或抽取技术实现变量变换 如果是抽取数据还需在变换前作滤波处理使之满足采样定理 变量变换完成后再用 Wavwrite函数重新定义量化位数和采样频率即可实现数据转换 数据转换过程中 要注意采样频率与原始采样频率及插值或抽取系数的关系MATLAB实现插值或抽取的函数有decimate

,interp和resample

这里以 2倍抽取为例 将例3中经过滤波后产生的XPquitFilter.WAV文件进行数据转换处理

具体程序如下

clear; close all; clc;

[x,FS,NBITS]=wavread('XPquitFilter.WAV'); % 将WAV文件转换成变量

N=length(x); % 计算数据点数

% 不是偶数点化成偶数点

if mod(N,2)==0; N=N; else x(N)=[]; N=N-1; end;

% 原信号波形频谱分析

tx=(0:N-1)/FS; % 计算原信号数据点时刻

subplot(3,2,1);plot(tx,x); % 绘制原信号波形

title(' 原信号波形图'); %加标题

xf=fft(x); % 求原信号频谱

fx=(0:N/2)*FS/N; % 确定频谱图频率刻度

subplot(3,2,2);plot(fx,abs(xf(1:N/2+1))); % 绘制原信号频谱

title(' 原信号频谱图'); %加标题

matlab 音乐信号处理,MATLAB 的音频信号处理技术 | 学步园相关推荐

  1. matlab设l创建网络,利用matlab进行简单的贝叶斯网络构建 | 学步园

    matlab的安装 第一次装matlab,装好后发现没有在桌面生成图标,还以为是最后提示的编译器没有安装.结果发现,matlab的图标在其安装的bin目录下面,进行初始化就能开始使用了 关于贝叶斯网络 ...

  2. matlab正弦函数fft,正弦函数及其FFT变换(一) | 学步园

    在MATLAB中想要画一个sin函数是很容易的,比如:首先定义t = 0:0.01:10,然后画出y = sin(2*pi*t)就可以了,最多再加相角啊之类的参数,但如果在C语言中应该如何自己制造一个 ...

  3. matlab输出高质量图片,Matlab 画平滑轮廓 print 高质量 figure | 学步园

    Matlab 画平滑轮廓 print 高质量 figure 在matlab中,想将分割的结果以轮廓的形式显示到灰度图上,要提取.绘制平滑轮廓. 自己提取轮廓.绘制,不方便,效果差. matlab提供了 ...

  4. matlab与c/c++混合...,matlab与c/c++ 混合编程之 MCR | 学步园

    什么是MCR? MCR之前是 matlab component runtime的缩写,后更名为 matlab compiler runtime.MCR实际上是一组独立的共享库,也即是常说的动态连接库, ...

  5. matlab 摄氏度符号怎么打,MATLAB中如何打角标和希腊字母 | 学步园

    声明:这是转载 很多时候都要在matlab画图的时候添加一些公式符号之类的,有一些特殊的字符并不能直接从键盘上输入,比如希腊字母等等.但是有想用,因为这样使图看起来漂亮而且容易理解. 例如:我想输入摄 ...

  6. matlab频域积分,matlab数值积分实现(时域频域积分) | 学步园

    最近做有关加速度的数据处理,需要把加速度积分成位移,网上找了找相关资料,发现做这个并不多,把最近做的总结一下吧! 积分操作主要有两种方法:时域积分和频域积分,积分中常见的问题就是会产生二次趋势.关于积 ...

  7. matlab gui uiwaitbar,MATLAB GUI嵌入进度条(waitBar) | 学步园

    基本就是参考:http://www.ilovematlab.cn/thread-61732-1-1.html,改了点点方便用 function mywaitbar(x,num,varargin) if ...

  8. matlab用lu求逆矩阵,Matlab实现——求矩阵的逆(LU分解) | 学步园

    Program  ( :Solve By Factorization with Pivoting ) 思路及原理: 就得到: 程序: function X=Ni(A) %Input - A is an ...

  9. 声纹技术(二):音频信号处理基础【模拟信号(连续)--采样-->数字信号(离散)--量化-->振幅简化为整数--编码-->二进制序列】【WAV音频格式】【SoX】【分帧-加窗-】

    2.1 欲懂声纹,先学音频 从学科分类上讲,声纹技术是语音信号处理的一个分支,而语音信号处理则属于音频信号处理这个大类. 语音信号和音频信号,这二者的区别在于: 语音信号专指人类说话时所发出的具有社会 ...

最新文章

  1. ORA-00845 : MEMORY_TARGET not supported on this system(调大数据库内存无法启动)
  2. TensorRT(2)-基本使用:mnist手写体识别
  3. P3317-[SDOI2014]重建【矩阵树定理,数学期望】
  4. php bin2hex(),PHP bin2hex() 函数 pack() 函数
  5. openwrt gpio控制与使用
  6. TCP/IP SOCKET HTTP及HTTPS之间的关系
  7. MySQL字符集详解
  8. MAC编译ffmpeg
  9. android Removing unused resources requires unused code shrinking to be turned on. 错误记录
  10. 织梦dedecms TAG标签调用汇总(史上最全)
  11. CSS3各种手型样式集合
  12. 史上最污的技术解读,我竟然秒懂了(上)
  13. android 流星动画,超简单的android 流星雨动画 流星动画
  14. 2022年中国工业软件市场现状及发展前景预测分析
  15. pyplot 画多个图时搅合到了一起_【收藏贴】家里来了好些小朋友,什么游戏可以让孩子们玩到一起?...
  16. TensorRT报错的一百种姿势 | 【❤️TensorRT抱错砖家❤️】
  17. Code bloat has become astronomical
  18. codeforces 766 C Mahmoud and a Message
  19. 线程sta模式_C# 设置为单线程单元(STA)模式
  20. idea 将代码块抽取为方法 快捷键

热门文章

  1. 【英文期刊论文排版】——利用EndNote在word中导入参考文献
  2. CCF画图---一个平平无奇的搜索题bfs
  3. 用jQuery实现Ajax
  4. 苹果iPad强于分销渠道:平板领域将继续强势
  5. spring aspect通知中获取request对象
  6. 计算机软硬件维护知识,硬件维护之计算机维护知识大全
  7. 林轩田机器学习基石笔记3:机器学习分类
  8. 利用Python做数据可视化
  9. 衡阳计算机网络学校,2020衡阳市信息网络工程学校简章
  10. 初中毕业计算机什么专业好就业,初中毕业后学什么专业好?