matlab 音乐信号处理,MATLAB 的音频信号处理技术 | 学步园
声音数据输入输出函数:
可以方便地读写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 的音频信号处理技术 | 学步园相关推荐
- matlab设l创建网络,利用matlab进行简单的贝叶斯网络构建 | 学步园
matlab的安装 第一次装matlab,装好后发现没有在桌面生成图标,还以为是最后提示的编译器没有安装.结果发现,matlab的图标在其安装的bin目录下面,进行初始化就能开始使用了 关于贝叶斯网络 ...
- matlab正弦函数fft,正弦函数及其FFT变换(一) | 学步园
在MATLAB中想要画一个sin函数是很容易的,比如:首先定义t = 0:0.01:10,然后画出y = sin(2*pi*t)就可以了,最多再加相角啊之类的参数,但如果在C语言中应该如何自己制造一个 ...
- matlab输出高质量图片,Matlab 画平滑轮廓 print 高质量 figure | 学步园
Matlab 画平滑轮廓 print 高质量 figure 在matlab中,想将分割的结果以轮廓的形式显示到灰度图上,要提取.绘制平滑轮廓. 自己提取轮廓.绘制,不方便,效果差. matlab提供了 ...
- matlab与c/c++混合...,matlab与c/c++ 混合编程之 MCR | 学步园
什么是MCR? MCR之前是 matlab component runtime的缩写,后更名为 matlab compiler runtime.MCR实际上是一组独立的共享库,也即是常说的动态连接库, ...
- matlab 摄氏度符号怎么打,MATLAB中如何打角标和希腊字母 | 学步园
声明:这是转载 很多时候都要在matlab画图的时候添加一些公式符号之类的,有一些特殊的字符并不能直接从键盘上输入,比如希腊字母等等.但是有想用,因为这样使图看起来漂亮而且容易理解. 例如:我想输入摄 ...
- matlab频域积分,matlab数值积分实现(时域频域积分) | 学步园
最近做有关加速度的数据处理,需要把加速度积分成位移,网上找了找相关资料,发现做这个并不多,把最近做的总结一下吧! 积分操作主要有两种方法:时域积分和频域积分,积分中常见的问题就是会产生二次趋势.关于积 ...
- matlab gui uiwaitbar,MATLAB GUI嵌入进度条(waitBar) | 学步园
基本就是参考:http://www.ilovematlab.cn/thread-61732-1-1.html,改了点点方便用 function mywaitbar(x,num,varargin) if ...
- matlab用lu求逆矩阵,Matlab实现——求矩阵的逆(LU分解) | 学步园
Program ( :Solve By Factorization with Pivoting ) 思路及原理: 就得到: 程序: function X=Ni(A) %Input - A is an ...
- 声纹技术(二):音频信号处理基础【模拟信号(连续)--采样-->数字信号(离散)--量化-->振幅简化为整数--编码-->二进制序列】【WAV音频格式】【SoX】【分帧-加窗-】
2.1 欲懂声纹,先学音频 从学科分类上讲,声纹技术是语音信号处理的一个分支,而语音信号处理则属于音频信号处理这个大类. 语音信号和音频信号,这二者的区别在于: 语音信号专指人类说话时所发出的具有社会 ...
最新文章
- ORA-00845 : MEMORY_TARGET not supported on this system(调大数据库内存无法启动)
- TensorRT(2)-基本使用:mnist手写体识别
- P3317-[SDOI2014]重建【矩阵树定理,数学期望】
- php bin2hex(),PHP bin2hex() 函数 pack() 函数
- openwrt gpio控制与使用
- TCP/IP SOCKET HTTP及HTTPS之间的关系
- MySQL字符集详解
- MAC编译ffmpeg
- android Removing unused resources requires unused code shrinking to be turned on. 错误记录
- 织梦dedecms TAG标签调用汇总(史上最全)
- CSS3各种手型样式集合
- 史上最污的技术解读,我竟然秒懂了(上)
- android 流星动画,超简单的android 流星雨动画 流星动画
- 2022年中国工业软件市场现状及发展前景预测分析
- pyplot 画多个图时搅合到了一起_【收藏贴】家里来了好些小朋友,什么游戏可以让孩子们玩到一起?...
- TensorRT报错的一百种姿势 | 【❤️TensorRT抱错砖家❤️】
- Code bloat has become astronomical
- codeforces 766 C Mahmoud and a Message
- 线程sta模式_C# 设置为单线程单元(STA)模式
- idea 将代码块抽取为方法 快捷键