当前位置: 首页 > news >正文

音频干扰检测(频域方法)

测试音响系统的通路上是否有外部干扰时,可以通过播放1000赫兹的正弦波信号,在输出端采集数字信号(I2S,TDD,A2B)并保存为.wav文件。 然后通过以下Python代码检测。

import numpy as np

import librosa

import matplotlib.pyplot as plt

def load_and_normalize_audio(audio_path, sr=48000, apply_window=True, channel=2):

    """channel参数指定要分析的声道,索引从0开始"""

    y, sr = librosa.load(audio_path, sr=sr, mono=False)

    # 确保选取多声道中的指定声道,如果是单声道信号,则直接使用

    if y.ndim > 1 and y.shape[0] > channel:

        y = y[channel, :]

    elif y.ndim > 1:

        print("Warning: Requested channel not found. Using first channel instead.")

        y = y[0, :]

    # 先归一化音频信号到[-1, 1]

    y = y / np.max(np.abs(y))

    # 应用窗函数

    if apply_window:

        window = np.hanning(len(y))

        y = y * window

    return y, sr

def find_interference(y, sr, target_freq, threshold_db=-80):

    """分析音频,找出除目标频率外的干扰信号"""

    # 计算FFT

    Y = np.fft.rfft(y)

    freqs = np.fft.rfftfreq(len(y), d=1/sr)

    # 计算幅度(dBFS)

    Y_amplitude = np.abs(Y) / len(Y)

    Y_dbfs = 20 * np.log10(np.maximum(Y_amplitude, 1e-12))

    # 将目标频率附近的幅度设置为非常低的数值来忽略目标频率

    target_idx = np.abs(freqs - target_freq).argmin()

    ignore_band = 10  # 忽略目标频率附近±10Hz范围

    Y_dbfs[target_idx-ignore_band:target_idx+ignore_band] = -np.inf

    # 寻找最大幅度的干扰频率

    max_idx = np.argmax(Y_dbfs)

    # 检查干扰是否高于阈值

    if Y_dbfs[max_idx] > threshold_db:

        print(f"检测到干扰频率:{freqs[max_idx]}Hz,幅度 {Y_dbfs[max_idx]}dB")

    else:

        print("未检测到显著干扰。")

def plot_spectrum(y, sr):

    """绘制频谱图"""

    Y = np.fft.rfft(y)

    freqs = np.fft.rfftfreq(len(y), d=1/sr)

    Y_amplitude = np.abs(Y) / len(Y)

    Y_dbfs = 20 * np.log10(np.maximum(Y_amplitude, 1e-12))

    plt.figure(figsize=(10, 6))

    plt.plot(freqs, Y_dbfs)

    plt.xlabel('Frequency (Hz)')

    plt.ylabel('Amplitude (dB)')

    plt.title('Frequency Spectrum')

    plt.ylim(-120, 0)

    plt.xlim(0, sr // 2)

    plt.show()

# 替换audio_path为你的音频文件路径

audio_path = 'sine.wav'

y, sr = load_and_normalize_audio(audio_path)

plot_spectrum(y, sr)

find_interference(y, sr, target_freq=1000)

以上代码由AI生成,本人调试完成,实测可用! :)

相关文章:

  • 大学生创业基础(考试--绝密版)
  • 一些常见的ClickHouse问题和答案
  • buy me a btc 使用数字货币进行打赏赞助
  • vue3+ts白屏问题解决
  • 【计算机网络】第三章 数据链路层(虚拟机与局域网)
  • python实战之PyQt5桌面软件
  • C++从入门到精通——缺省参数
  • 【scala】使用gradle和scala构建springboot程序
  • 数字乡村战略实施:科技引领农村经济社会全面发展
  • ThreadPoolExecutor经典面试题
  • javaWeb项目-火车票订票信息系统功能介绍
  • 在Debian 11上安装GCC
  • 深度学习 - PyTorch基本流程 (代码)
  • 没学数模电可以玩单片机吗?
  • 【flutter】flutter基础总结1
  • C# 免费离线人脸识别 2.0 Demo
  • css系列之关于字体的事
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • JAVA之继承和多态
  • JDK 6和JDK 7中的substring()方法
  • maya建模与骨骼动画快速实现人工鱼
  • PHP的类修饰符与访问修饰符
  • Service Worker
  • Vue2.x学习三:事件处理生命周期钩子
  • Vultr 教程目录
  • 警报:线上事故之CountDownLatch的威力
  • 容器服务kubernetes弹性伸缩高级用法
  • 如何编写一个可升级的智能合约
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 说说动画卡顿的解决方案
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 为视图添加丝滑的水波纹
  • 用jquery写贪吃蛇
  • 栈实现走出迷宫(C++)
  • MPAndroidChart 教程:Y轴 YAxis
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #stm32整理(一)flash读写
  • (1) caustics\
  • (2.2w字)前端单元测试之Jest详解篇
  • (二)windows配置JDK环境
  • (分布式缓存)Redis持久化
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (学习日记)2024.01.19
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .net framework 4.0中如何 输出 form 的name属性。
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .Net 高效开发之不可错过的实用工具
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • .net中应用SQL缓存(实例使用)