<P>function C1=small_mfcc(data)<BR>N=256;<BR>shift=80;<BR>nfft=256; <BR>numoverlap=N-shift; <BR>fs=8000;<BR>%帧间移动</P>
<P>fft_window=specgram(data,nfft,fs,hamming(N),numoverlap);<BR>%每列代表每帧的fft变换<BR>fft_frequency=abs(fft_window);<BR>SM=[];<BR>[frame_rows,frame_sum_colums]=size(fft_frequency);<BR>%应该加循环对每个列进行滤波,每个列代表一个窗<BR> for fft_colums=1:frame_sum_colums <BR> evf=fft_frequency(:,fft_colums); <BR> for filter_S=1:24<BR> c=100; %定义滤波器阶数97阶<BR> fc1=[300, 350, 400, 450, 500, 550, 600, 650, 700, 750, 800, 850, 900, 950, 1123,1296,1469,1642,1815,1988,2161,2334,2507,2853];%下限截止频率<BR> fc2=[400, 450, 500, 550, 600, 650, 700, 750, 800, 850, 900, 950, 1000 ,1296, 1469,1642,1815,1988,2161,2334,2507,2853,3199,3545];%上限截止频率<BR> %参数转换,将模拟滤波器的技术指标转换为数字滤波器的技术指标<BR> w1=2*pi*fc1(filter_S)/fs;<BR> w2=2*pi*fc2(filter_S)/fs; <BR> %使用三角窗函数<BR> window=triang(c+1); <BR> %使用标准响应的加窗设计函数fir1<BR> h=fir1(c,[w1/pi w2/pi],window); <BR> %第frame帧滤波结果<BR> S(:,filter_S)=filter(h,1,evf);<BR> end<BR> SM=cat(2,SM,S);%得到一个Mel频谱<BR> S(:)=[];<BR> <BR>end%得到一个数字Mel频谱 <BR> %滤波器组输出的对数能量为CM<BR> %206帧,每个帧经过个滤波器,最后得到206*13个对数能量输出<BR> colums_sum=length(SM);<BR> for colums_s=1:colums_sum %每一列进行对数能量处理<BR> colums_s <BR> for log_s=1:129%行循环<BR> A=((abs(SM(log_s,colums_s)).^2)*hamming(log_s)); <BR> end<BR> <BR> end<BR> %得到余弦变换系数 <BR> C=dct(log(A));<BR> <BR> C1=dct(A,16)<BR> <BR> clear frame_sum_colums;<BR> return </P> |