本文主要给出一点音频,通过短时傅立叶变换和智能咖啡变换绘制时频图。
0、准备工作
首先准备音频。 事先用ffmpeg切断1秒的音频。 音频采样率为44100,但采样点数为46076点,时间约为1.04s秒。
1、短时傅里叶变换
首先,在matlab中,短时傅立叶变换的分析函数为spectrogram,其使用状况如下。
语法:
[S,f,t,p]=spectrogram(x,window,noverlap,nfft,fs ) ]
[S,f,t,p]=spectrogram(x,window,noverlap,f,fs ) ]
说明:如果使用时没有输出参数,光谱图将自动绘制; 如果有输出参数,则返回输入信号的短时间傅立叶变换。 当然,也可以根据函数的返回值s、f、t、p绘制频谱图。 具体请参照示例。
参数:
x---输入信号的矢量。 缺省情况下,如果没有后续输入参数,则x分为八部分并分别进行转换;如果x不能分为八部分,则截断。 默认情况下,其他参数的默认值为
窗口---窗函数,默认为nfft长汉明窗Hamming
noverlap---每个段的重复采样数。 默认值在段之间产生50%的重复
用于NFFT---FFT转换的长度,缺省值为256和大于每段长度的最小二乘之间的最大值。 另外,除了常数之外,还可以指定频率矢量f
fs---采样频率,默认归一化频率。
窗口---窗函数。 如果窗口为整数,则x分割为窗口字段,每个字段使用Hamming窗函数添加窗。 如果窗口是向量,则x被分割为length(window )段,每个段使用窗口向量中指定的窗函数打开窗。 因此,在想要取得specgram函数的功能的情况下,指定256长度的Hann窗即可。
Noverlap---各段之间重叠的样本点数。 它必须是小于窗口或长度(窗口)的整数。 其意思是,两个相邻的窗户不是跟在后面,而是两个窗户交叉,有重叠的部分。
Nfft---计算离散傅立叶变换的分数。 它必须是标量。
Fs---如果指定采样频率Hz、[],则默认值为1Hz。
S---输入信号x的短时傅立叶变换。 其中每一列包含短期局部时间的频率分量估计,时间沿列增加,频率沿行增加。
如果x是长度为Nx的复信号,则s是nfft行k列的复矩阵。 这里,k依赖于窗
如果窗口是标量,则k=fix((NX-nOverlap )/(window-noverlap ) )
如果窗口是向量,则k=fix((NX-noverlap )length ) window )-nOverlap ) )
对于实信号x,如果nfft为偶数,则s的行数为nfft/2 1,如果nfft为奇数,则行数为[nfft1]/2,并且列数相同。
F---输入变量使用f频率向量。 函数使用Goertzel方法,以f指定的频率计算光谱图。 指定的频率将舍入为与信号分辨率相关的最近的DFT容器(可接受的星星)。 在其他使用nfft的语法中,使用短时傅立叶变换法。 关于返回值的f向量,是四舍五入的频率,其长度等于s的行数。
当计算T---谱图时,其长度等于上面定义的k,值是每个分割段的中点。
对于p--能谱密度PSD (功率谱密度)、实信号,p是各级PSD的单边周期估计; 如果对复信号指定f频率向量,则p为双边PSD。
MATLAB程序:
[Au,fs]=audioread(c:(users ) cdq )桌面(output.MP3 ) ); % Fs采样率44100[B,f,t,p ]=spectrogram (au (:1 ),1024,512,1024,Fs ); % B是f大小行t大小列的频率峰值,p是对应的能谱密度figureimagesc(t、f、c ); set(GCA,' YDir ',' normal ' ) colorbar; xlabel (时刻t/s ); ylabel (频率f/Hz ); title (短时傅立叶时间频率图); 执行结果:
2、潇洒的咖啡变换
首先,在matlab中,潇洒的咖啡变换的分析函数为cwt,其使用情况如下:
cwt函数功能:实现一维连续潇洒的咖啡变换的函数。
cwt函数语法格式:
COEFS=cwt(S, SCALES, 'wname')
COEFS=cwt(S, SCALES, 'wname', 'plot')
COEFS=cwt(S, SCALES, 'wname', 'PLOTMODE')
COEFS=cwt(S, SCALES, 'wname', 'PLOTMODE', XLIM)
使用说明:cwt为一维潇洒的咖啡变换的函数。
格式 COEFS=cwt(S, SCALES, 'wname') 采用'wname'潇洒的咖啡,在正、实尺度SCALES下计算向量一维潇洒的咖啡系数。
格式 COEFS=cwt(S, SCALES, 'wname', 'plot') 除了计算潇洒的咖啡系数外,还加以图形显示。
格式 COEFS=cwt(S, SCALES, 'wname', 'PLOTMODE') 计算并画出连续潇洒的咖啡变换的系数,并使用PLOTMODE对图形着色。
格式 COEFS=cwt(S, SCALES, 'wname', 'plot') 相当于 格式 COEFS=cwt(S, SCALES, 'wname', 'PLOTMODE') 中的语法 COEFS=cwt(S, SCALES, 'wname', 'absglb')
格式 COEFS=cwt(S, SCALES, 'wname', 'PLOTMODE', XLIM) 能够计算并画出连续潇洒的咖啡变换的系数。系数使用PLOTMODE和XLIM进行着色。其中:XLIM=[x1,x2],并且有如下关系:1<=x1<=x2<=length(S)。
MODE值含义:
'lvl' scale-by-scale着色模式
'glb' 考虑所有尺度的着色模式
'abslvl'或'lvlabs' 使用系数绝对值的scale-by-scale着色模式
'absglb'或'glbabs' 使用系数绝对值并考虑所有尺度的着色模式
COEFS行的大小等于SCALES尺度的长度,COEFS列的大小等于信号S的长度。
MATLAB程序:
wavename='cmor3-3';totalscal=1024;Fc=centfrq(wavename); % 潇洒的咖啡的中心频率 测得Fc = 3c=2*Fc*totalscal; % 测得c = 1536scals=c./(1:totalscal);f=scal2frq(scals,wavename,1/fs); % 将尺度转换为频率 频率在0-500Hz取1024个点coefs = cwt(Au(:,1),scals,wavename); % 求连续潇洒的咖啡系数t=0:1/fs:size(Au(:,1))/fs;figureimagesc(t,f,abs(coefs));set(gca,'YDir','normal')colorbar;xlabel('时间 t/s');ylabel('频率 f/Hz');itle('潇洒的咖啡时频图');运行结果: