Python音频处理-图解傅里叶分析

简介: 傅里叶分析是一种将函数表示为周期成分之和的方法,并通过离散傅里叶变换(DFT)将信号从时域转换到频域,提取频率特征。通过快速傅里叶变换(FFT),我们可分析方波的主要频率成分,并利用这些成分重建波形,直观展示频率域对原始信号的影响。

傅里叶分析本质上是一种将函数表示为周期成分之和的方法,并从这些成分中还原原始函数。

当函数及其傅里叶变换都被替换为离散化版本时,称为离散傅里叶变换(DFT)。

离散傅里叶变换能将输入分解成不同频率的组成部分。

  • 变换的离散输入通常被称为信号(signal),存在于时域
  • 输出则被称为频谱(spectrum) 或 变换(transform),存在于频域

实验步骤如下:

  • 首先定义一个标准的方波波形。
  • 利用快速傅里叶变化提取主要的频率特征。
  • 利用主要的频率特征重建波形,与原始波形对比。
  • 绘制三维图分解频率特征,直观感受频率域对原始波形的影响。
import numpy as np
# 绘图工具
import matplotlib.pyplot as plt
import matplotlib as mpl
# 中文乱码处理(从window下找个中文ttf文件,即可)
font_path = 'simhei.ttf'
mpl.font_manager.fontManager.addfont(font_path)
plt.rcParams['font.sans-serif'] = ['simhei']
plt.rcParams['axes.unicode_minus'] = False

标准方波

# 采样率和时长
sr = 16_000
T = 4
# 生成方波
x = np.linspace(0, T, T * sr, endpoint=False)
y = 1 * np.sign(
    np.sin(2 * np.pi * 0.5 * x)
)
# 绘制方波
plt.figure(figsize=(5, 3))
plt.plot(x, y)
plt.grid(True)
plt.ylabel('振幅')
plt.xlabel('时间')
plt.axhline(y=0, color='k', linestyle='-', linewidth=1)
plt.show()

image.png

快速傅里叶变换

# 采样总数量
n = len(y)
# 快速傅里叶变换
y_fft = np.fft.fft(y)
# 计算频率范围
y_freq = np.fft.fftfreq(n, 1 / sr)
# 对称的频率取一半
y_fft = y_fft[:n//2]
y_freq = y_freq[:n//2]
# 信号能量提取
magnitude = 2.0 * np.abs(y_fft) / n
# 绘制频域能量图
plt.figure(figsize=(5, 3))
plt.scatter(y_freq, magnitude, alpha=0.5)
plt.title('幅度 vs 频率')
plt.xlabel('频率')
plt.ylabel('幅度')
plt.grid(True)
plt.show()

image.png

由上图可知:能量主要集中在,低频的那几个频率上。

主要的频率特征

# 这里以幅度的0.1为预置
threshold = 0.1
# 提取幅度大于0.1的频率及其幅度大小
mask = magnitude > threshold
detected_freqs = y_freq[mask]
detected_amps = magnitude[mask]
# 输出主要频率及其能量
print(detected_freqs)
print(detected_amps)

[0.5 1.5 2.5 3.5 4.5 5.5]

[1.27323954 0.42441318 0.25464791 0.18189136 0.14147105 0.11574904]

# 绘制能量及其频率关系图
plt.figure(figsize=(5, 3))
plt.plot(detected_freqs, detected_amps)
plt.show()

image.png

重建波形

根据影响最大的几个频率幅度,重建波形;函数如下:

image.png

# 重建波形
re_wave = np.zeros_like(y, dtype=np.float64)
for freq, amp in zip(detected_freqs, detected_amps):
    re_wave += amp * np.sin(2 * np.pi * freq * x)
# 重建波形 与 原始波形对比
plt.figure(figsize=(5, 3))
plt.plot(x, y, label='原始信号')
plt.plot(x, re_wave, label='重建信号')
plt.grid(True)
plt.legend()
plt.show()

image.png

调小幅度阈值threshold,利用更多的频率特征及其幅度,重建信号更加逼近原始信号。

三维图分解频率特征

# 创建3d图形
fig = plt.figure(figsize=(20, 10))
ax = fig.add_subplot(111, projection='3d')
# 原始波形
ax.plot(x, y, zs=-3, zdir='y', label='原始信号')
# 近似整合波形
rebuild_wave = np.zeros_like(y, dtype=np.float64)
# 分频波形
for freq, amp in zip(detected_freqs, detected_amps):
    if freq > 0:
        component = amp * np.sin(2 * np.pi * freq * x)
        rebuild_wave += component
        ax.plot(
            x,
            component,
            zs=freq,
            zdir='y',
            label=f'频率={freq},幅度={amp}'
        )
ax.plot(x, rebuild_wave, zs=-1, zdir='y', label='重建信号')
# 基本配置
ax.set_xlabel('时间')
ax.set_ylabel('频率')
ax.set_zlabel('幅度')
ax.set_title('三维波形分解图')
# 增强配置
ax.view_init(elev=30., azim=-25.)
# 显示图例
ax.legend()
plt.tight_layout()
plt.show()

image.png

如上图:

  • 第一条是原始波形
  • 第二条是重建波形
  • 之后的波形是对应频率刻度上的特征波形
相关文章
|
机器学习/深度学习 算法 Python
机器学习特征筛选:向后淘汰法原理与Python实现
向后淘汰法(Backward Elimination)是机器学习中一种重要的特征选择技术,通过系统性地移除对模型贡献较小的特征,以提高模型性能和可解释性。该方法从完整特征集出发,逐步剔除不重要的特征,最终保留最具影响力的变量子集。其优势包括提升模型简洁性和性能,减少过拟合,降低计算复杂度。然而,该方法在高维特征空间中计算成本较高,且可能陷入局部最优解。适用于线性回归、逻辑回归等统计学习模型。
471 7
|
Python
Python如何给视频添加音频和字幕
通过以上方法和代码示例,你可以在Python中成功实现视频的音频和字幕添加。确保理解每一步的实现细节,应用到实际项目中时能有效地处理各种视频编辑需求。
717 20
|
机器学习/深度学习 算法 数据可视化
8种数值变量的特征工程技术:利用Sklearn、Numpy和Python将数值转化为预测模型的有效特征
特征工程是机器学习流程中的关键步骤,通过将原始数据转换为更具意义的特征,增强模型对数据关系的理解能力。本文重点介绍处理数值变量的高级特征工程技术,包括归一化、多项式特征、FunctionTransformer、KBinsDiscretizer、对数变换、PowerTransformer、QuantileTransformer和PCA,旨在提升模型性能。这些技术能够揭示数据中的潜在模式、优化变量表示,并应对数据分布和内在特性带来的挑战,从而提高模型的稳健性和泛化能力。每种技术都有其独特优势,适用于不同类型的数据和问题。通过实验和验证选择最适合的变换方法至关重要。
643 6
8种数值变量的特征工程技术:利用Sklearn、Numpy和Python将数值转化为预测模型的有效特征
|
编解码 Python
Python如何给视频添加音频和字幕
Python如何给视频添加音频和字幕
|
机器学习/深度学习 数据格式 Python
将特征向量转化为Python代码
将特征向量转化为Python代码
174 3
|
数据处理 Python
Python在音频传输中的应用实例解析
Python在音频传输中的应用实例解析
261 1
|
存储 编解码 API
分享一个 Python 处理音频的库
分享一个 Python 处理音频的库
410 2
|
机器学习/深度学习 数据格式 Python
将特征向量转化为Python代码
将特征向量转化为Python代码
98 1
|
存储 数据可视化 Python
使用python moviepy提取视频中的音频,同时对音频数据进行数据可视化分析
使用python moviepy提取视频中的音频,同时对音频数据进行数据可视化分析
824 0

推荐镜像

更多