Python音频处理-频谱图实现

简介: 本教程介绍如何使用 PyTorch 提取音频特征,重点实现频谱图的生成。内容包括使用 torchaudio 进行频谱提取、频谱图维度解析、手动实现频谱计算步骤,并对两种方法的结果进行对比分析,展示其差异与实现细节。

参考 pytorch 音频特征提取教程:

https://docs.pytorch.org/audio/stable/tutorials/audio_feature_extractions_tutorial.html

准备

from IPython.display import Audio
from torchaudio.utils import download_asset
from librosa import power_to_db
import matplotlib.pyplot as plt
import numpy as np
import torchaudio

# 基本参数
n_fft = 512
hop_length = 512

# 示例音频
sample_speech = download_asset(
    "tutorial-assets/Lab41-SRI-VOiCES-src-sp0307-ch127535-sg0042.wav"
)

# 提取频谱
waveform, sample_rate = torchaudio.load(sample_speech)
print(waveform.shape)
print(sample_rate)

torchaudio实现

spectrogram = torchaudio.transforms.Spectrogram(
    n_fft=n_fft,
    hop_length=hop_length
)
spec = spectrogram(waveform)
spec.shape

torch.Size([1, 257, 107])

频谱有三个维度:

通道域: 单声道即为1,双声道即为2

频率域: n_fft // 2 + 1

时间域: (总采样数 / 窗口长度(win_length)) + 1 (默认每次移动半个窗口)

# 绘制波形和频谱图
_, axs = plt.subplots(2, 1)
axs[0].plot(waveform[0])
axs[1].imshow(
    power_to_db(spec[0]), 
    origin='lower', 
    aspect='auto', 
    interpolation='nearest'
)
plt.tight_layout()
plt.show()

image.png

自实现

实现频谱图计算一般包括一下步骤:

  • 1、计算帧数。时间维度的长度。
  • 2、扩展信号。如果不满足整数帧的长度,需要扩展原始信号满足长度。
  • 3、分帧。
  • 4、快速傅里叶变换。
# 手动实现频谱计算
def my_spectrogram(signal, n_fft=512, hop_length=512):
    # 数组转换
    signal = np.asarray(signal)
    # 计算帧数
    signal_length = len(signal)
    num_frames = int(np.ceil(signal_length / hop_length))
    # 扩展信号
    pad_length = (num_frames - 1) * hop_length + n_fft - signal_length
    signal = np.pad(
        signal,
        (0, pad_length),
        mode='constant'
    )
    # 分帧
    frames = np.lib.stride_tricks.sliding_window_view(
        signal,
        window_shape=n_fft
    )[::hop_length]
    # 加窗
    window = np.hanning(n_fft)
    frames = frames * window
    # 快速傅里叶变换
    fft_result = np.fft.fft(frames, axis=1)
    magnitude_spectrum = np.abs(fft_result) ** 2
    # 对称处理
    magnitude_spectrum = magnitude_spectrum[:, : n_fft//2 + 1]
    return magnitude_spectrum
# 计算频谱
my_spec = my_spectrogram(waveform[0].numpy())
my_spec.shape

(107, 257)

对比两个频谱

# 绘制波形和频谱图
_, axs = plt.subplots(2, 1)
axs[0].imshow(
    power_to_db(spec[0]), 
    origin='lower', 
    aspect='auto', 
    interpolation='nearest'
)
axs[1].imshow(
    power_to_db(my_spec.T), 
    origin='lower', 
    aspect='auto', 
    interpolation='nearest'
)
plt.tight_layout()
plt.show()

image.png

如上图,频谱图,肉眼看不出什么较大差别。

但是mse差异较大:

# 计算两个频谱差距
import torch
mse = torch.square(spec[0] - my_spec.T).mean().item()
mse

604.3883183638077

相关文章
|
4月前
|
Python
Python音频特征-梅尔滤波器
梅尔滤波器组是一种基于梅尔刻度的三角滤波器组,常用于音频信号处理。其构建步骤包括:获取梅尔刻度的范围、生成梅尔刻度序列、构建三角滤波器组并进行归一化处理。梅尔刻度反映了人耳对频率的感知特性,能更有效地表示音频特征。
155 0
|
算法 PyTorch 算法框架/工具
Pytorch学习笔记(九):Pytorch模型的FLOPs、模型参数量等信息输出(torchstat、thop、ptflops、torchsummary)
本文介绍了如何使用torchstat、thop、ptflops和torchsummary等工具来计算Pytorch模型的FLOPs、模型参数量等信息。
2276 2
|
10月前
|
机器学习/深度学习 计算机视觉 iOS开发
YOLOv11改进策略【模型轻量化】| 替换骨干网络 CVPR-2024 RepViT 轻量级的Vision Transformers架构
YOLOv11改进策略【模型轻量化】| 替换骨干网络 CVPR-2024 RepViT 轻量级的Vision Transformers架构
626 12
|
10月前
|
Serverless 计算机视觉
YOLOv11改进策略【小目标改进】| Shape-NWD:融合改进,结合Shape-IoU和NWD 更好地适应小目标特性
YOLOv11改进策略【小目标改进】| Shape-NWD:融合改进,结合Shape-IoU和NWD 更好地适应小目标特性
1710 9
|
数据可视化 Python
python WAV音频文件处理——(3)高效处理大型 WAV 文件
python WAV音频文件处理——(3)高效处理大型 WAV 文件
341 9
|
Web App开发 缓存 Linux
高效Selenium测试技巧:轻松控制已开启的浏览器
【10月更文挑战第13天】在进行Selenium测试时,通常会启动新浏览器实例,但有时需要控制已开启的浏览器,以节省时间并更真实地模拟用户行为。这可通过设置Chrome为可远程控制并使用`Remote WebDriver`连接实现。需在启动Chrome时添加`--remote-debugging-port`参数,并通过Python脚本中的`webdriver.Remote`连接至指定端口。此外,还可利用会话ID(Session ID)重新连接浏览器,提高测试灵活性。需要注意浏览器版本兼容性及元素定位稳定性等问题,确保测试准确性和一致性。
1095 1
|
计算机视觉
vs2019_qt6.2.4_dcmtk3.6.7_vtk9.2.2_itk5.3_opencv4.6.0编译记录
这篇文章记录了使用VS2019编译Qt6.2.4、DCMTK3.6.7、VTK9.2.2、ITK5.3和OpenCV4.6.0的过程,包括下载和编译步骤,并提供了遇到编译错误时的解决方案和参考链接。
387 0
vs2019_qt6.2.4_dcmtk3.6.7_vtk9.2.2_itk5.3_opencv4.6.0编译记录
|
Ubuntu Python
全网最简约的Vscode配置Anaconda环境(百分百成功)
全网最简约的Vscode配置Anaconda环境(百分百成功)
32000 0
全网最简约的Vscode配置Anaconda环境(百分百成功)
|
机器学习/深度学习 人机交互 API
【机器学习】Whisper:开源语音转文本(speech-to-text)大模型实战
【机器学习】Whisper:开源语音转文本(speech-to-text)大模型实战
4785 0