matlab实现背景声消除
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab实现背景声消除相关的知识,希望对你有一定的参考价值。
现有两个wav文件,一个是A歌曲的人声+配乐,一个是A歌曲的纯配乐,问一下用matlab怎样可以把人声分离出来。
原理我不太懂,大致觉得类似于减法,应该可以相减得到人声,请教各位高手了。
请把算法列出来,测试通过的话再追加100分,多谢了
试验项目,需要用matlab仿真的
==========================
应该是过滤吧 就是拿A歌曲的人声+配乐的WAV然后把A歌曲的纯配乐过滤掉 matlab没用过,不过原理应该相同
==========================
找了点资料,楼主看看
#include <stdio.h>
#include <cv.h>
#include <highgui.h>
int main( int argc, char** argv )
//声明IplImage指针
IplImage* pFrame = NULL;
IplImage* pFrImg = NULL;
IplImage* pBkImg = NULL;
CvMat* pFrameMat = NULL;
CvMat* pFrMat = NULL;
CvMat* pBkMat = NULL;
CvCapture* pCapture = NULL;
int nFrmNum = 0;
//创建窗口
cvNamedWindow("video", 1);
cvNamedWindow("background",1);
cvNamedWindow("foreground",1);
//使窗口有序排列
cvMoveWindow("video", 30, 0);
cvMoveWindow("background", 360, 0);
cvMoveWindow("foreground", 690, 0);
if( argc != 2 )
fprintf(stderr, "Usage: bkgrd <video_file_name>\n");
return -1;
//打开视频文件
if( !(pCapture = cvCaptureFromFile(argv[1])))
fprintf(stderr, "Can not open video file %s\n", argv[1]);
return -2;
//逐帧读取视频
while(pFrame = cvQueryFrame( pCapture ))
nFrmNum++;
//如果是第一帧,需要申请内存,并初始化
if(nFrmNum == 1)
pBkImg = cvCreateImage(cvSize(pFrame->width, pFrame->height),
IPL_DEPTH_8U,1);
pFrImg = cvCreateImage(cvSize(pFrame->width, pFrame->height),
IPL_DEPTH_8U,1);
pBkMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);
pFrMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);
pFrameMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);
//转化成单通道图像再处理
cvCvtColor(pFrame, pBkImg, CV_BGR2GRAY);
cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY);
cvConvert(pFrImg, pFrameMat);
cvConvert(pFrImg, pFrMat);
cvConvert(pFrImg, pBkMat);
else
cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY);
cvConvert(pFrImg, pFrameMat);
//先做高斯滤波,以平滑图像
//cvSmooth(pFrameMat, pFrameMat, CV_GAUSSIAN, 3, 0, 0);
//当前帧跟背景图相减
cvAbsDiff(pFrameMat, pBkMat, pFrMat);
//二值化前景图
cvThreshold(pFrMat, pFrImg, 60, 255.0, CV_THRESH_BINARY);
//进行形态学滤波,去掉噪音
//cvErode(pFrImg, pFrImg, 0, 1);
//cvDilate(pFrImg, pFrImg, 0, 1);
//更新背景
cvRunningAvg(pFrameMat, pBkMat, 0.003, 0);
//将背景转化为图像格式,用以显示
cvConvert(pBkMat, pBkImg);
//显示图像
cvShowImage("video", pFrame);
cvShowImage("background", pBkImg);
cvShowImage("foreground", pFrImg);
//如果有按键事件,则跳出循环
//此等待也为cvShowImage函数提供时间完成显示
//等待时间可以根据CPU速度调整
if( cvWaitKey(2) >= 0 )
break;
// end of if-else
// end of while-loop
//销毁窗口
cvDestroyWindow("video");
cvDestroyWindow("background");
cvDestroyWindow("foreground");
//释放图像和矩阵
cvReleaseImage(&pFrImg);
cvReleaseImage(&pBkImg);
cvReleaseMat(&pFrameMat);
cvReleaseMat(&pFrMat);
cvReleaseMat(&pBkMat);
return 0;
参考资料:http://bbs.matwav.com/post/view?bid=105&id=758044&sty=0
参考技术A http://www.sodw.org/html/matlab/1012712.html可以看下这里的! 参考技术B 楼主我用的也是:Cool Edit Pro 2.1
用这个可以,装上三个插件很简单的,还可以找到教程!本回答被提问者采纳 参考技术C 为什么不用COOLEDIT?
声反馈消除技术
一般声反馈MIC通过音箱放出来的声音再次被MIC采集,从而再次放大不断循环达到音箱的极限后形成了啸叫。
声反馈消除技术(啸叫抑制):现在用的有三种:移频技术,陷波器技术,自适应滤波器处理。
移频的话计算量最小,我们知道所有信号都可以看成正弦信号叠加而成,只需要用到Hilbert变换FIR滤波器即可以实现。ti 5509定点DSP上实现移频算法,移5Hz的频率,效果只能提升3dB左右增益。
陷波器技术国外厂商(塞宾,dbx)用得最多,音质相对其它两种算法要好。陷波器的难点在于啸叫点的查找,一般来讲可以通过谐波辅助来查找,然而频率的分辨率也是要考虑到的问题,是用FFT,CZT,还是其它频谱细化的算法,算法的复杂度也要考虑的。一般在浮点DSP上实现。增益也只能提升3dB左右。可以看下《Fifty Years of Acoustic Feedback Control》。
自适应滤波器国内用的最多,提升增益最多,在相同的条件下可以提升9dB以上,音质在可接受范围内,16k采样率的话,用了25%左右CPU(450MHz),最终要不断测试验证,才可以有比较好的效果。另外话筒,音箱的质量也会对效果有影响。
专业演唱还是调音师用EQ来处理;在低成本的市场就用移频器;自适应滤波可以用在教室,会议等对扩声要求比较大的场合;陷波器则可用在对音质要求高会议,扩声要求不大的场合。别外对于自适应滤波波的音质及延时还需要提升。
以上是基于个人的一些认识,不当之处请指正。
以上是关于matlab实现背景声消除的主要内容,如果未能解决你的问题,请参考以下文章
语音识别基于mfcc特征模板匹配算法实现声纹识别matlab源码含GUI
MATLAB教程案例30基于MATLAB的图像阴影检测和消除算法的实现