logo资料库

matlab-音乐检索.doc

第1页 / 共11页
第2页 / 共11页
第3页 / 共11页
第4页 / 共11页
第5页 / 共11页
第6页 / 共11页
第7页 / 共11页
第8页 / 共11页
资料共11页,剩余部分请下载后查看
差分由于语音信号是时域连续的,分帧提取的特征信息只反应了本帧语音的特性,为了使特征更能体现时域连续
基于信号频谱分析的音乐检索专题研讨 【目的】 (1) 加深信号频谱的概念,以及对信号频域分析基本原理和方法的理解。 (2) 培养学生理论联系实际的素质,提高学生的工程实践能力和创新能力。 (3) 培养学生查阅文献、自主学习的能力。 【知识点】 信号的抽样、频域分析,滤波器等 【背景知识】 语音信号的频谱分析始于上世纪 50 年代,首先由 Bell 实验室率先发明语谱仪,可以将语音信 号以时间,频率,强度等信息表现出来。60 年代,出现线性预测分析技术(LP Linear prediction) 和动态规划(DP Dynamic Programming),其中后者较好的解决了不等长语音匹配的问题。70 年代, 动态时间弯折(DTW Dynamic time warping)的成熟以及矢量量化(VQ Vector quantization)和隐马 尔科夫模型(HMM Hidden markov model)的出现使得实践操作上实现基于线性预测倒谱和 DTW 技术的 特定人孤立词语音识别系统。80 年代,HMM 模型和人工神经网络(ANN)成功应用,统计模型取代模板 匹配的方法成为主流。90 年代,特征参数和自适应技术让统计模型得到进一步的发展。 音乐检索的主要方法是基于内容的检索,即利用音乐的音符、旋律、节奏、歌曲风格等语义级 的特征或者声学层特征从数据库中检索乐曲。本研究专题使用基于信号频谱分析的方法实现音乐检 索。 【研讨内容】 (1) 建立音乐检索数据库。数据库有若干首歌曲或乐曲构成。格式自定。 (2) 设计并实现乐曲信号的去噪算法。 (4) 设计并实现乐曲信号的匹配算法。 (5) 设计并实现音乐检索系统的界面。 【温馨提示】 (1) 可以上网查阅语音识别的文献及相关算法。 (2) 曲目之间不宜过于类似。 (3) 需要综合频谱分析、滤波器等知识点。 【研讨要求】 (1) 利用 MATLAB,编写仿真程序,实现音乐检索系统。 (2) 设计并实现检索系统界面。 (3) 完成音乐检索系统的研究报告,报告包括课题背景、系统流程、具体方法、实验结果以及 参考文献
一、整体思路: 建立音乐库——特征提取——特征匹配 —— 结果显示 对 所选 入库 歌曲 进 行特征提取,选择同 样的特征参数,建立 mat 形式的库。(设计 函数 build_quku) 将 Mel 频率倒 谱 系 数 作 为 特征参数(设 计 mfcc_m 函 数) 利 用 动 态 时 间 规 整 法 (DTW )进行参数匹 配,对应欧式距离最短 的即为最佳匹配项(设 计 dtw_func 函数) 利 用 guide 函 数 设 计 识别界面,并将匹配 结果对应的歌曲名称 显示在界面上(设计 facial_design 函数) 二、具体算法 特征提取——mfcc MFCC 是在 Mel 标度频率域提取出来的倒谱参数,Mel 标度描述了人耳频率的非线性特性,它 与频率的关系可用下式近似表示: Mel(f) = 2595 * lg(1 + f / 700) 式中 f 为频率,单位为 Hz。下图为 Mel 频率与线性频率的关系: 关键步骤: 转化到梅尔频率、然后进行倒谱分析 基本流程: 预加重——分帧 ——加窗——频域转换——使用梅尔刻度滤波器组过滤 ——能量值取 log——离散余弦变换——差分
预加重 将语音信号通过高通滤波器,提升其高频部分,使信号的频谱变得平坦,保持在低频到高频的 整个频带中,能用同样的信噪比求频谱。 目的 : 为了消除发声过程中,声带和嘴唇造成的效应,来补偿语音信号受到发音系统所压抑的高频部分。 并且能突显高频的共振峰。 分帧 对音乐信号分段处理。先将 N 个采样点集合成一个观测单位,称为帧。通常情况下 N 的值为 256 或 512,涵盖的时间约为 20~30ms 左右。为了避免相邻两帧的变化过大,因此会让两相邻帧之 间有一段重叠区域,此重叠区域包含了 M 个取样点,通常 M 的值约为 N 的 1/2 或 1/3。 目的: 对整段语音信号分帧,即切分成很多段,当整段信号不平滑时,分成小份的信号,使小段的信号看 起来是稳定平滑的。 加窗 目的: 分帧越多与原始信号的误差也就越大,加窗就是为了解决这个问题,使分帧后的信号变得连续,每 一帧就会表现出周期函数的特征。用于平滑信号,使用汉明窗加以平滑的话,相比于矩形窗函数, 会减弱 FFT 以后旁瓣大小以及频谱泄露。 频域转换 1. 目的 将时域信号转化到频域进行后续的频率分析 2. 实现 幅度谱: Si(k)=∑n=1Nsi(n)e−j2πkn/N1≤k≤K 功率谱: Pi(k)=1N|Si(k)2| 使用梅尔刻度滤波器组过滤 目的: 因为频域信号有很多冗余,滤波器组可以对频域的幅值进行精简,每一个频段用一个值来表示。 实现: 对于 FFT 得到的幅度谱,分别跟每一个滤波器进行频率相乘累加,得到的值即为该帧数据在在该滤 波器对应频段的能量值。
能量值取 log 由于人耳对声音的感知并不是线性的,用 log 这种非线性关系更好描述。取完 log 以后才可以进行倒 谱分析。 离散余弦变换 DCT 和 DFT 类似,但是只使用实数,不涉及复数运算。信号经过 DCT 变换以后,能量会集中到低 频部分,可以用于图像压缩。 目的 : 按照倒谱的定义,该步需要进行反傅里叶变换然后通过低通滤波器获得最后的低频信号。这里使用 DCT 直接就可以获取频率谱的低频信息。 由于滤波器之间是有重叠的,所以前面的获得的能量值之间是具有相关性的,DCT 还可以对数据进 行降维压缩和抽象,获得最后的特征参数。相比于傅里叶变换,离散余弦变换的结果没有虚部,更 好计算。 差分 由于语音信号是时域连续的,分帧提取的特征信息只反应了本帧语音的特性,为了使特 征更能体现时域连续性,可以在特征维度增加前后帧信息的维度。常用的是一阶差分和 二阶差分。 仿真程序: function ccc=mfcc_m(x,fs,p,frameSize,inc) %输入参数:x 为输入的语音序列,fs 为采样频率,p 为 Mel 滤波器个数,frameSize 为 帧长,inc 为帧移 %输出参数:ccc 为 MFCC 参数和一阶差分 MFCC 参数 % 提取 Mel 滤波器参数,用汉明窗函数 bank=melbankm(p,frameSize,fs,0,0.5,'m'); % 归一化 Mel 滤波器组系数 bank=full(bank); bank=bank/max(bank(:)); % DCT 系数,12*p for k=1:12 n=0:p-1; dctcoef(k,:)=cos((2*n+1)*k*pi/(2*p)); end
% 归一化倒谱提升窗口 w = 1 + 6 * sin(pi * [1:12] ./ 12); w = w/max(w); % 预加重滤波器 xx=double(x); xx=filter([1 -0.9375],1,xx); % 语音信号分帧 xx=enframe(xx,frameSize,inc); n2=fix(frameSize/2)+1; % 计算每帧的 MFCC 参数 for i=1:size(xx,1) y = xx(i,:); s = y' .* hamming(frameSize); t = abs(fft(s)); t = t.^2; c1=dctcoef * log(bank * t(1:n2)); c2 = c1.*w'; m(i,:)=c2'; End %差分系数 dtm = zeros(size(m)); for i=3:size(m,1)-2 dtm(i,:) = -2*m(i-2,:) - m(i-1,:) + m(i+1,:) + 2*m(i+2,:); end dtm = dtm / 3; %合并 MFCC 参数和一阶差分 MFCC 参数 ccc = [m dtm]; %去除首尾两帧,因为这两帧的一阶差分参数为 0 ccc = ccc(3:size(m,1)-2,:); 建立音乐库
仿真程序 [sample1,FS]=audioread('I Hate Myself For Loving You.wav');%读取歌曲为 样品 [sample2,FS]=audioread('The New Boy.wav'); [sample3,FS]=audioread('Love Yourself.wav'); fullsample1=sample1(1:800000,1); fullsample2=sample2(1:800000,1);%改为单声道,减少取样点 fullsample3=sample3(1:800000,1); % Fs=4000000; % fullsample1=resample(fullsample1,Fs,FS); % fullsample2=resample(fullsample2,Fs,FS); % fullsample3=resample(fullsample3,Fs,FS); fullsample1=fullsample1'; fullsample2=fullsample2'; %转置 fullsample3=fullsample3'; Fs=40000; cccfullsample1=mfcc_m(fullsample1,Fs,13,Fs/4,Fs/8); cccfullsample2=mfcc_m(fullsample2,Fs,13,Fs/4,Fs/8); %求解特征参数 mfcc_m cccfullsample3=mfcc_m(fullsample3,Fs,13,Fs/4,Fs/8); save('cccfullsample1','cccfullsample1'); save('cccfullsample2','cccfullsample2');%用其特征建立以 mat 形式的音乐库 save('cccfullsample3','cccfullsample3'); 3. 特征匹配——DTW
程序中,首先申请两个 n×m 的距阵 D 和 d,分别为累积距离和帧匹配距离。这里 n 和 m 为测试模 板与参考模板的帧数。然后通过一个循环计算两个模板的帧匹配距离距阵 d。接下来进行动态规划, 为每个格点(i,j)都计算其三个可能的前续格点的累积距离 D1、D2 和 D3。考虑到边界问题,有 些前续格点可能不存在,因此要加入一些判断条件。最后利用最小值函数 min,找到三个前续格点 的累积距离的最小值作为累积距离,与当前帧的匹配距离 d(i,j)相加,作为当前格点的累积距离。 该计算过程一直达到格点(n,m),并将 D(n,m)输出,作为模板匹配的结果。 function dist=mydtw(y,w) m=size(y,1); n=size(w,1); %分别求取输入特征参数 y,w 的长度 %构建帧匹配距离矩阵 d = ones(m,n); for i = 1:m for j = 1:n d(i,j)=y(i,:)-w(j,:))^2; %欧式距离 计算公式 end end %构建累积距离矩阵 c2=ones(m,n)*realmax; D(1,1)=d(1,1) %动态规划 for i=2:m; for D2=realmax; j>1 D2=D(i-1,j-1); j=1:n D1=D(i-1,j); If Else End If Else End test1 = [c(i,j-1),c(i-1,j-1),c(i-1,j)]; D(i,j)=d(i,j)+min(test1); j>2 D3=D(i-1,j-2); D3=realmax; End End dist=D(m,n); end
分享到:
收藏