音频信号处理笔记(一)

本文介绍了音频信号处理中的关键步骤,包括信号的时域分析,特别是分帧技术,如不重叠和重叠分帧,以及分帧后的幅值包络和均方根能量计算。这些概念在语音识别和音频分类等领域至关重要,通过示例代码展示了如何使用librosa库进行实际操作。
摘要由CSDN通过智能技术生成

相关课程:【音频信号处理及深度学习教程】

0

信号的叠加:https://teropa.info/harmonics-explorer/

一个复杂信号分解成若干简单信号分量之和。不同个频率信号的叠加: 由于和差化积,会形成包络结构与精细结构。

image-20230130151227607

由上图可知,低频信号决定了信号的包络形状,高频信号决定其精细结构。

在语音识别中,主要通过信号的包络结构来区分不同音频信号,因此在识别领域更关注低频作用

1 信号的时域分析

1.1 分帧

image-20230130152419473

分帧:将信号按照时间尺度分割,每一段的长度就是长frame_size,分出n段,为的个数frame_num,如果不考虑重叠分帧,那么该信号总的采样点数为frame_size * frame_n um。

分帧重叠:为了让分后的信号更加平滑,需要重叠分帧,也就是下一帧中包含上一帧的采样点,那么包含的点数就是重叠长度hop_size。

分帧补零:帧的个数frame_num= 总样本数N / 重叠数hop_size(分不补零),因为的个数frame_num是整数为了不舍弃最后一帧不能凑成一个完整长的点,需要对信号补零。此时帧的个数frame num =(总样本数N - 帧长frame size)/ 重叠数hop _size(分补零)+1

1.1.1 幅值包络

幅值包络:依次寻找每一帧的幅值最大值,将每一帧中幅值最大值连起来就是幅值包络(响度、音频检测、音频分类)

image-20230218131627766

现提取第t帧的AE值,其中k是采样点数,t是序列数,K是每一帧的帧长,采样点k点在t k,(t+1) k-1

代码如下:

import librosa
import numpy as np
import librosa.display
from matplotlib import pyplot as plt

wave_path_absolute = r"E:\VoiceDev\audio_data\music_piano.wav"
wave_path = "../audio_data/music_piano.wav"
# 1. 加载信号以及采样率
waveform, sample_rate = librosa.load(wave_path_absolute, sr=None)


# 2. 定义AE函数,功能是取信号每一帧中幅值最值为该帧的包络
# 信号,每一帧长,重叠长度
def Calc_Amplitude_Envelope(waveform, frame_length, hop_length):
    # 如果按照帧长来分割信号,余下部分不能形成一个帧则需要补0
    if len(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个数
        waveform = np.pad(waveform, pad_width=(0, pad_num), mode="wrap")  # 补0操作

    frame_num = int((len(waveform) - frame_length) / hop_length) + 1
    waveform_ae = []
    for t in range(frame_num):
        current_frame = waveform[t * (frame_length - hop_length):t * (frame_length - hop_length) + frame_length]
        current_ae = max(current_frame)
        waveform_ae.append(current_ae)
    return np.array(waveform_ae)


# 3. 设置参数:每一帧长1024,以50%的重叠率分帧,调用该函数
frame_size = 1024
hop_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))
librosa.display.waveshow(waveform)
plt.plot(time_scale, waveform_AE, color='red')
plt.title("Amplitude_Envelope")
plt.show()

image-20230211205028744

image-20230211205035717

1.1.2 均方根能量

均方根能量(Root mean square energy)(响度、音频分段分类)

依次寻找每一帧中的RMSE,它的值为第t帧中每点幅值平方再取均值后开根号

image-20230218132027554

代码如下:

# 0. 预设环境
import librosa
import numpy as np
from matplotlib import pyplot as plt
import librosa.display

# 1.加载信号
wave_path_absolute = r"E:\VoiceDev\audio_data\music_piano.wav"
wave_path = "../audio_data/music_piano.wav"
waveform, sample_rate = librosa.load(wave_path_absolute, sr=None)

# 2.定义函数RMS,功能:计算每一帧的均方根能量
def Calc_RMS(waveform, frame_length, hop_length):
    # 如果按照帧长来分割信号,余下部分不能形成一个帧则需要补0
    if len(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个数
        waveform = np.pad(waveform, pad_width=(0, pad_num), mode="wrap")  # 补0操作

    frame_num = int((len(waveform) - frame_length) / hop_length) + 1
    waveform_rms = []
    for t in range(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)
        waveform_rms.append(current_rms)
    return waveform_rms

# 3. 设置参数:每一帧长1024,以50%的重叠率分帧,调用该函数
frame_size = 1024
hop_size = int(frame_size * 0.5)
waveform_RMS = Calc_RMS(waveform=waveform, frame_length=frame_size, hop_length=hop_size)

# 4.绘制图像
frame_scale = np.arange(0, len(waveform_RMS), step=1)
time_scale = librosa.frames_to_time(frame_scale, hop_length=hop_size)
plt.figure(figsize=(20, 10))
plt.plot(time_scale, waveform_RMS, color='red')
plt.title("Root-Mean-Square-Energy")
librosa.display.waveshow(waveform)
plt.show()

# 5. 利用librosa.feature.rms绘制信号的RMS
waveform_RMS_librosa = librosa.feature.rms(y=waveform, frame_length=frame_size, hop_length=hop_size).T[1:,0]
plt.figure(figsize=(20, 10))
plt.plot(time_scale, waveform_RMS_librosa, color='red')
plt.title("Root-Mean-Square-librosa")
librosa.display.waveshow(waveform)
plt.show()

bias = waveform_RMS_librosa - waveform_RMS
print(f"the bias is {bias}\n Congratulation!")


运行结果:红色线即均方根能量

image-20230218140824181

### 回答1: 《现代数字信号处理》是由张颢编写的一本课程笔记。该笔记系统地介绍了现代数字信号处理的基本概念、原理和方法。笔记的内容分为多个章节,从信号与系统基础知识开始,逐步深入讲解了离散时间信号与系统、时域分析、傅里叶变换、滤波器设计、多频率信号处理、图像处理等方面的内容。 首先,笔记从信号与系统理论基础开始,介绍了连续时间信号与离散时间信号的概念及其相应的离散时间系统模型。然后,详细介绍了离散时间系统的时域分析方法,包括系统差分方程、单位脉冲响应和单位阶跃响应的求解。接着,笔记引入了离散时间信号的傅里叶变换,讨论了离散傅里叶变换和快速傅里叶变换的原理和应用。 在滤波器设计方面,笔记详细介绍了低通滤波器、高通滤波器、带通滤波器和带阻滤波器的设计方法。其中,滤波器的性能分析和设计常常使用MATLAB等工具进行仿真和实验验证。 此外,笔记还介绍了多频率信号处理的相关内容,包括多频率信号的采样、混频器的设计和频谱分析等。最后,笔记还对图像处理中的数字图像采集、空间域与频率域图像处理进行了简要介绍。 总之,《现代数字信号处理》笔记由张颢编写,内容丰富全面,适合作为数字信号处理专业的教材或参考书使用。笔记通过详实的理论讲解和实例分析,帮助读者全面理解现代数字信号处理的基本概念和方法,为读者进一步深入研究数字信号处理提供了坚实的基础。 ### 回答2: 《现代数字信号处理》是由张颢编写的一本教材,用于介绍数字信号处理的基础知识和应用技术。该课程笔记主要包括以下几个方面的内容: 首先,该笔记从信号与系统的基础开始,介绍了离散信号的表示及其性质,以及离散系统的分析与设计方法。通过学习这些内容,我们能够更好地理解信号的离散化处理过程,为后续的数字信号处理方法打下坚实的基础。 其次,笔记详细介绍了数字滤波器的设计与应用。数字滤波器是数字信号处理的重要部分,其功能包括信号的去噪、频率分析和信号恢复等。通过学习这部分内容,我们可以了解不同类型的数字滤波器的特点和应用领域,以及它们的设计方法和性能评估指标。 另外,笔记还介绍了离散傅里叶变换(DFT)和快速傅里叶变换(FFT)的原理和应用。DFT和FFT是数字信号处理中常用的频域分析工具,能够将时域信号转换到频域,从而实现频域处理,如频谱分析和滤波等。通过学习这些内容,我们可以更好地理解傅里叶变换的原理和性质,掌握频域分析的方法和技巧。 最后,笔记还介绍了一些实际应用中常用的数字信号处理技术,如图像与音频处理、通信系统和生物医学信号处理等。这些应用领域广泛,通过学习这些内容,我们可以了解数字信号处理在不同领域的应用案例和实践经验。 通过学习《现代数字信号处理》这门课程笔记,我们可以全面系统地学习数字信号处理的基础理论和相关技术,为今后从事相关领域的研究和实践打下坚实的基础。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值