1)用mp3录音,生成文件cricket.wav,把该文件放到matlab文件夹里面(就是你打开matlab后中间顶部的地址)。
2)使用如下程序,做波形显示以及fft变换。
[y,Fs,bits]=wavread('cricket.wav')%读出信号,采样率和采样位数。
y=y(:,1)%我这里假设你的声音是双声道,我只取单声道作分析,如果你想分析另外一个声道,请改成y=y(:,2)
sigLength=length(y)
Y = fft(y,sigLength)
Pyy = Y.* conj(Y) / sigLength
halflength=floor(sigLength/2)
f=Fs*(0:halflength)/sigLength
figureplot(f,Pyy(1:halflength+1))xlabel('Frequency(Hz)')
t=(0:sigLength-1)/Fs
figureplot(t,y)xlabel('Time(s)')
3)频率看频谱就有了,声音间隔看声音波形,周期看声音波形。
4)关于去噪声。
a)如果噪声是特定频率的周期噪声(periodic noise),比如说50hz,那么你可以用matlab的filter,作一个低通、高通、带通或者带阻滤波。
b)如果声音是高斯白噪声。那就用自适应滤波(adaptive filter,wiener filter)。这里涉及到中烂对噪声的采样、计算特征值以及决定阶数的问题。
c)幸好我们可以“耍赖羡穗”——用cool editor。用它打开wav文件,用鼠标把一段噪声圈起来,采样,然后直接选择去噪就可以了。各大网站有介绍。
MATLAB是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。
MATLAB是matrix&laboratory两个词的组合,意为矩阵工厂(矩阵实验室)。是由美国mathworks公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言(如C、Fortran)的编辑模式,代表了当卖派漏今国际科学计算软件的先进水平。
我们这学期刚学的凌阳61板,语音程序有A2000,S480,S2403种算法,我先给个A2000的,还需要的话发消息给我,一起学习啦!#include "A2000.h"
#define SPEECH_1 0
#define DAC1 1
#define DAC2 2
#define Ramp_UpDn_Off 0
#define Ramp_UpDn_On 3
#define Manual 0
#define Auto 1
#define Full 1
#define Empty 2
#define Mode 1
//===============================================================================================
/颤橘/ 函数: main()
// 描述:主函数
//===============================================================================================
main()
{
extern long RES_WW_24K_SA,RES_WW_24K_EA //定义语音资源的首末地址标号
long int Addr //定义地址变量
int Ret = 0 //定义获取语音数据变量并初始化
if(Mode == 1) //采用自动方式播放
{
SACM_A2000_Initial(1)//自动方式播放初始化
SACM_A2000_Play(SPEECH_1,DAC1,Ramp_UpDn_On) //销键定义语音索引号、播放通道、允许亏洞巧音量增/减调节
while(1){
F_ClearWatchdog()
SACM_A2000_ServiceLoop()} //获取语音数据并将其填入解码队列
}
if(Mode == 0)//采用非自动方式播放
{
Addr=RES_WW_24K_SA//送入语音队列的首址
SACM_A2000_Initial(0) //非自动方式播放的初始化
SACM_A2000_InitDecoder(DAC1) //开始对A2000的语音数据以非自动方式解码
while(SACM_A2000_TestQueue()!=Full) //测试并获取语音队列的状态
{
Ret=SP_GetResource(Addr) //从资源文件里获取一个字型语音数据
SACM_A2000_FillQueue(Ret) //获取语音编码数据并填入语音队列等候解码
Addr++
}
while(1)
{
if(SACM_A2000_TestQueue()!=Full)
{
Ret =SP_GetResource(Addr)
SACM_A2000_FillQueue(Ret)
Addr++
}
if(Addr<RES_WW_24K_EA ) //如果该段语音未播完,即未到达末地址时
SACM_A2000_Decoder() //获取资源并进行解码,再通过中断服务子程序送入DAC通道播放
else
SACM_A2000_Stop() //否则,停止播放
F_ClearWatchdog()//清看门狗
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)