目录
- 信号分析简介
- 什么是信号分析
- 为什么要分析信号
- 信号分析的方式
- 信号的时频域分析
- 信号的时域分析
- 时域分析——幅值包络AE
- 时域分析——均方根值RMS
- 时域分析——过零率ZCR
- 信号的频域分析
- 谱质心
- 子带带宽
- 信号的时频分析——STFT
- 傅里叶级数
- 周期信号的傅里叶级数分析
- 三角函数形式的傅里叶级数
- 指数形式的傅里叶级数
- 周期信号的功率特性
- 函数的对称性与傅里叶系数的关系
- 傅里叶有限级数与最小方均误差
- 典型周期信号的傅里叶级数
- 周期矩形脉冲信号
- 周期锯齿脉冲信号
- 周期三角脉冲信号
- 傅里叶变换
- 典型非周期信号的傅里叶变换
- 单边指数信号
- 双边指数信号
- 矩形脉冲信号
- 钟形脉冲信号
- 傅里叶变换的基本性质
- 卷积原理
- 傅里叶变换(FT)的Python实现
- FFT
- 利用FFT和IFFT实现去噪
- STFT
- 语音信号处理
- 频谱、时频图概念
- 时域、频域概念
信号分析简介
什么是信号分析
- 将一个复杂信号分解成若干简单信号分量之和,或者用有限的一组参量去表示一个复杂波形的信号,从这些简单的分量组成情况去考察复杂信号的特性;
- 特征提取的过程,从一段复杂的波形中提取出我们需要的信息
为什么要分析信号
- 信号分析是获取信号特征信息的重要手段,通过对信号分析,得到复杂信号的基本特征。
- 信号分析是获取信号源特征信息的重要手段,人们往往可以通过对信号特征的详细了解,得到信号源特性、运行状况等信息。
- 深度学习的第一步都是要收集数据集的特征(f e a t u r e featurefeature)。所以需要信号分析,提取出信号数据集的特征集。
信号分析的方式
根据信号的类型:
- 平稳信号:信号不随时间变化,可在时域和频域直接分析
- 非平稳信号:信号随时间变化,需将信号拆解分析
- 时间维度拆解:利用平均瞬时功率信号等,可以知道信号传播的规律
- 频域维度拆解:按照不同频带的滤波器进行滤波处理,平均瞬时功率谱信号
- 时频域维度拆解:同时包含信号随时间和频率变化的规律
信号的频域拆解: 一个复杂信号分解成若干简单信号分量之和。不同个频率信号的叠加,由于和差化积,会形成包络结构与精细结构。
其中低频信号决定了信号的包络形状,高频信号决定其精细结构。在语音识别中,主要通过信号的包络结构来区分不同音频信号,因此在识别领域更关注低频作用。
信号的时频域分析
信号的时域分析
时域分析——幅值包络AE
幅值包络:依次寻找每一帧中的幅值最大值,将每一帧中幅值最大值连起来就是幅值包络
A E t = m a x k = t K ( t + 1 ) K − 1 s ( k ) AE_t = \mathop{max}\limits^{(t+1)K-1}_{k=tK}s(k)AEt=k=tKmax(t+1)K−1s(k)
现提取第t tt帧的AE值,其中k kk是采样点数,t tt是帧序列数,K KK是每一帧的帧长,采样点k kk点在t ∗ K , ( t + 1 ) ∗ ( K − 1 ) {t*K, (t+1)*(K-1)}t∗K,(t+1)∗(K−1)
应用:振幅包络可以给出响度(soundness)的大致信息,对突变信号特别敏感
功能:音频检测、音频分类
分帧:将信号按照时间长度分割,每一段的长度就是帧长frame _size,分出n nn段,则说明帧的个数为frame_num。如果不考虑重叠分帧,该信号总的采样点数为frame_size * frame_num
分帧重叠:为了让分帧后的信号更加平滑,需要重叠分帧,也就是下一帧中包含上一帧的采样点,包含的点数就是重叠长度hop_size
补零:因为帧的个数frame_num是整数,为了不舍弃最后一帧不能凑成一个完整帧长的点,需要对信号补零
分帧不补零:帧的个数frame_num = N/hop_size(N为总样本数)
分帧补零:帧的个数frame_num = ((N - frame_size)/hop_size) + 1
""" 提取信号的幅值包络 # 0. 预设环境 下载语音库librosa 数组处理库nunpy # 1. 加载信号 librosa.load() # 2. 定义一个AE的函数,功能为取信号每一帧中幅值最值为该帧的包络 # 最值的获取方式:max(waveform[t*(frame_size-hop_size):t*frame_size]) # 3. 设置参数:每一帧长1024,以50%的重叠率分帧,调用该函数 # 4. 绘制信号的幅值包络信息 """# 0.预设环境 下载语音库librosa 数组处理库nunpyimportlibrosaimportnumpyasnp#重命名numpy为npfrommatplotlibimportpyplotasplt# 绘图库importlibrosa.display# 1. 加载信号 librosa.load()# 绝对路径(相比于相对路径,需要加“r”)wave_path=r"D:\PycharmProjects\Audio-based-DL\audio_data\music_piano.wav"wave_path_relative="audio_data/music_piano.wav"# 相对路径# 使用librosa.load()加载信号,默认采样率16000waveform,sample_rate=librosa.load(wave_path,sr=None)# 2. 定义一个AE的函数,功能为取信号每一帧中幅值最值为该帧的包络defCalc_Amplitude_Envelope(waveform,frame_length,hop_length):iflen(waveform)%hop_length!=0:#判断分帧是否需要补零# 帧的个数 = (总样本数-帧长/ 重叠数(分帧补零) + 1frame_num=int((len(waveform)-frame_length)/hop_length)+1# 补零个数=帧的个数*重叠数+帧长-总样本数pad_num=frame_num*hop_length+frame_length-len(waveform)# 补零后的信号波形(补零格式wrap)waveform=np.pad(waveform,pad_width=(0,pad_num),mode="wrap")frame_num=int((len(waveform)-frame_length)/hop_length)+1waveform_ae=[]# 定义为列表形式fortinrange(frame_num):# 遍历每一帧current_frame=waveform[t*(frame_length-hop_length):t*(frame_length-hop_length)+frame_length]# 当前帧的位置(参考帧图理解)current_ae=max(current_frame)# 当前帧的最大值即为AE值waveform_ae.append(current_ae)returnnp.array(waveform_ae)#将列表转换为数组形式# 3. 设置参数:每一帧长1024,以50%的重叠率分帧,调用该函数frame_size=1024hop_size=int(frame_size*0.5)# 重叠长度waveform_AE=Calc_Amplitude_Envelope(waveform=waveform,frame_length=frame_size,hop_length=hop_size)# 调用函数得到信号的幅值包络值# 4. 绘制信号的幅值包络信息frame_scale=np.arange(0,len(waveform_AE))# 帧的尺度# 帧的尺度转换为时间尺度time_scale=librosa.frames_to_time(frame_scale,hop_length=hop_size)plt.figure(figsize=(20,10))# 画布尺寸:长20,宽10librosa.display.waveshow(waveform)# 展示原图plt.plot(time_scale,waveform_AE,color="r")plt.title("Amplitude_Envelope")plt.show()蓝色的是用librosa.display绘制出的信号波形,红色的是用函数Calc_Amplitude_Envelope计算出的幅值包络值
时域分析——均方根值RMS
RMSE计算:依次寻找每一帧中的RMSE,其值为第t帧中每点幅值平方再取均值后开根号
R M S t = 1 K ∑ k = t K ( t + 1 ) K − 1 s ( k ) 2 RMS_t = \sqrt{\frac 1 K {\sum ^{(t+1)K-1}_{k=tK}}s(k)^2 }RMSt=K1k=tK∑(t+1)K−1s(k)2
RMSE和AE对比:RMSE体现了每一帧的包络变化,适用于不平稳的信号,尤其是突变信号,RMSE得到的值较平稳,因为它利用每一帧的所有点幅值的平均值,而不像AE利用每一帧中的最大幅值。
应用:RMSE与响度有关,用于音频分段、分类。
"""信号的均方根值RootMeanSquareEnergy # 0.预设环境 # 1.加载信号 # 2.定义函数RMS,功能:计算每一帧的均方根能量 # 3.设置参数:每一帧长1024,以50%的重叠率分帧,调用该函数 # 4.绘制图像 # 5.利用librosa.feature.rms绘制信号的RMS # 6.比较两者差异 """# 0.预设环境importlibrosaimportnumpyasnpfrommatplotlibimportpyplotaspltimportlibrosa.display# 1.加载信号wave_path=r"D:\PycharmProjects\Audio-based-DL\audio_data\music_piano.wav"waveform,sample_rate=librosa.load(wave_path,sr=None)# 2.定义函数RMS,功能:计算每一帧的均方根能量defCalc_RMS(waveform,frame_length,hop_length):# 传参:信号,每帧长度,重叠长度iflen(waveform)%hop_length!=0:# 判断是否需要补零frame_num=int((len(waveform)-frame_length)/hop_length)+1# 帧的个数pad_num=frame_num*hop_length+frame_length-len(waveform)# 补零个数# 从第一维即0开始补零,补零个数pad_numwaveform=np.pad(waveform,pad_width=(0,pad_num),mode="wrap")# 新的信号分帧的个数frame_num=int((len(waveform)-frame_length)/hop_length)+1waveform_rms=[]# 定义为空列表fortinrange(frame_num):# 遍历每一帧current_frame=waveform[t*(frame_length-hop_length):t*(frame_length-hop_length)+frame_length]# 当前帧# 当前帧均方根值(均方根公式)current_rms=np.sqrt(np.sum(current_frame**2)/frame_length)# 信号的RMS值(将current_rms放在waveform_rms之后)waveform_rms.append(current_rms)returnnp.array(waveform_rms)# 列表转换为数组# 3.设置参数:每一帧长1024,以50%的重叠率分帧,调用该函数frame_size=1024hop_size=int(frame_size*0.5)waveform_RMS=Calc_RMS(waveform,frame_size,hop_size)# 自己定义的绘制均方根值的函数# 4.绘制图像frame_scale=np.arange(0,len(waveform_RMS),step=1)# 通过分帧尺度frame_scale得到时间尺度time_scaletime_scale=librosa.frames_to_time(frame_scale)plt.figure(figsize=(20,10))librosa.display.waveshow(waveform)# 初始波形# 横轴为time_scale,纵轴为waveform_RMS,颜色为红色plt.plot(time_scale,waveform_RMS,color="r")plt.title("Root-Mean-Square-Energy")plt.show()# 5.利用librosa.feature.rms绘制信号的RMSwaveform_RMS_librosa=librosa.feature.rms(y=waveform,frame_length=frame_size,hop_length=hop_size).T[1:,0]# 使用librosa构造的均方根值需要转置plt.figure(figsize=(20,10))librosa.display.waveshow(waveform)plt.plot(time_scale,waveform_RMS_librosa,color="r")plt.title("Root-Mean-Square-Energy_librosa")plt.show()# 计算两者间的偏差值# 偏差值=使用librosa构造的均方根值-自己定义的计算均方根的函数bias=waveform_RMS_librosa-waveform_RMSprint(f"the bias is{bias}\n")时域分析——过零率ZCR
过零率:是一个信号符号变化的比率,即在每帧中语音信号从正变为负或从负变为正的次数。
计算第t tt帧信号过零点数:
Z C R t = 1 2 ∑ k = t K ( t + 1 ) K − 1 ∣ s g n ( s ( k ) ) − s g n ( s ( k + 1 ) ) ∣ ZCR_t = \frac 1 2 {\sum ^{(t+1)K-1}_{k=tK}\mid sgn(s(k))-sgn(s(k+1)) \mid}ZCRt=21k=tK∑(t+1)K−1∣sgn(s(k))−sgn(s(k+1))∣
其中s g n sgnsgn是符号函数,前一个点与后一个点符号相反,则相减的绝对值为2;前一个点与后一个点符号相同,则相减的绝对值为0。前面乘以1 / 2 1/21/2,还需要除帧的长度,也就是取均值。
功能:用于语音识别和音乐信息检索。通常对类似金属、摇滚等高冲击性的声音具有更高的价值。一般情况下,过零率越大,频率近似越高。
"""信号的过零率ZCR # 0.预设环境 # 1.加载信号 # 2.定义函数,功能:计算每一帧的过零率,公式=该帧信号的平方和,开根号后, 取帧长的平均值 np.sum(np.abs(np.sign(a)-np.sign(b)))/2/frame_length # 3.设置参数:每一帧长1024,以50%的重叠率分帧,调用该函数 # 4.绘制图像 # 5.利用librosa.feature. # 6.比较两者差异 """# 0.预设环境importlibrosaimportnumpyasnpfrommatplotlibimportpyplotaspltimportlibrosa.display# 1.加载信号wave_path=r"D:\PycharmProjects\Audio-based-DL\audio_data\music_piano.wav"waveform,sample_rate=librosa.load(wave_path,sr=None)# 2.定义函数,功能:计算每一帧的过零率defCalc_ZCR(waveform,frame_length,hop_length):# 传参iflen(waveform)%hop_length!=0:# 判断是否需要补零frame_num=int((len(waveform)-frame_length)/hop_length)+1pad_num=frame_num*hop_length+frame_length-len(waveform)# 补零个数waveform=np.pad(waveform,pad_width=(0,pad_num),mode="wrap")frame_num=int((len(waveform)-frame_length)/hop_length)+1# 新的波形补零个数waveform_zcr=[]fortinrange(frame_num):current_frame=waveform[(frame_length-hop_length)*t:(frame_length-hop_length)*t+frame_length]# 当前帧a=np.sign(current_frame[0:frame_length-1,])# 过零率公式(前一个点符号值)b=np.sign(current_frame[1:frame_length,])# 后一个点符号值current_zcr=np.sum(np.abs(a-b))/2/frame_length# 过零率公式waveform_zcr.append(current_zcr)returnnp.array(waveform_zcr)# 3.设置参数:每一帧长1024,以50%的重叠率分帧,调用该函数frame_size=1024hop_size=int(frame_size/2)waveform_ZCR=Calc_ZCR(waveform,frame_size,hop_size)# 4.绘制图像frame_scale=np.arange(0,len(waveform_ZCR),step=1)# 分帧尺度time_scale=librosa.frames_to_time(frame_scale,hop_length=hop_size)plt.figure(figsize=(20,10))plt.plot(time_scale,waveform_ZCR,color="r")plt.title("Zero-Cross-rate")plt.show()# 5.利用librosa.feature.#为了使librosa绘制的图像和自己定义的函数绘制的图象一致,需要转置一下waveform_zrc_librosa=librosa.feature.zero_crossing_rate(y=waveform,frame_length=frame_size,hop_length=hop_size).T[1:,0]plt.figure(figsize=(20,10))plt.plot(time_scale,waveform_zrc_librosa,color="r")plt.title("Zero-Cross-rate-librosa")plt.show()# 计算偏差bias=waveform_zrc_librosa-waveform_ZCRprint(f"the bias is{bias}\n")信号的频域分析
谱质心
谱质心是频率成分的重心,是在一定频率范围内通过能量加权平均的频率,单位是H z HzHz
S C = ∑ n = 1 N f ( n ) E ( n ) ∑ 1 N E ( n ) = ∑ n = 1 N f ( n ) P ( E ( n ) ) SC = \frac {\sum ^N _{n=1} f(n)E(n)}{\sum ^N _1 E(n)} = \sum ^N _{n=1} f(n)P(E(n))SC=∑1NE(n)∑n=1Nf(n)E(n)=n=1∑Nf(n)P(E(n))
SC = (每一帧的幅值 * 对应点的频率的和)/每帧的幅值之和
应用:谱质心描述了声音的明亮度,具有阴暗、低沉品质的声音倾向有较多低频内容,谱质心相对较低;具有明亮、欢快品质的多数集中在高频,谱质心相对较高。该参数常用于对乐器声色的分析研究。
子带带宽
计算:在谱质心的频谱范围,计算距离每一帧中心点的平均值。
BW = (每个采样点减去谱质心的绝对值 * 对应点的权重值) / 总的权重之和
B W t = ∑ n = 1 N ∣ n − S C t ∣ m t ( n ) ∑ n = 1 N m t ( n ) BW_t = \frac {\sum ^N_{n=1}\mid {n-SC_t\mid m_t(n)}}{\sum ^N _{n=1}m_t(n)}BWt=∑n=1Nmt(n)∑n=1N∣n−SCt∣mt(n)