You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过单频音生成移相反向声波实现消音效果的技术咨询

单频音相消降噪实现修改方案

单频主动降噪的核心逻辑是生成与原噪声频率相同、振幅匹配、相位相差180°的反相声波,二者叠加后相互抵消实现消音。你当前的代码已经完成了单频检测的核心步骤,只需做以下调整即可实现移相消音:

1. 先修正采样率不匹配问题

你当前录音模块用的采样率是8000Hz,生成声波模块用的是44100Hz,采样率不一致会导致相位计算完全错位,先将AudioInput类中的采样率参数统一为44100Hz:

// 把原来的final float sampleRate= 8000.0f; 改为
final float sampleRate= 44100.0f;

2. 从FFT结果中提取目标频率的相位

你现在只计算了FFT结果的幅值,没有提取相位信息,找到峰值频率对应的复数后直接调用方法就能拿到相位:

// 在findFrequency方法里找到峰值index后,新增以下代码
Complex peakComplex = cmplx[index];
double originPhase = peakComplex.getArgument(); // 原信号的相位值,单位为弧度

3. 生成180°移相的反相声波

有两种方式实现反相,二选一即可:

  • 简单方案:直接给正弦输出值乘以-1,等价于相位偏移180°
  • 精准方案:在计算角度时直接偏移π(180°),同时叠加原信号的相位保证对齐

对应修改生成声波的代码段:

for (int i = 0; i < duration*(float) 44100/1000; i++) { 
    float numberOfSamplesToRepresentFullSin = (float) samplingsize / beatpersec;
    // 原有angle计算逻辑基础上,叠加原相位+180°偏移
    double angle = i / (numberOfSamplesToRepresentFullSin/ 2.0) * Math.PI + originPhase + Math.PI;
    short a = (short) (Math.sin(angle) * 32767);
    buf[0] = (byte) (a & 0xFF);
    buf[1] = (byte) (a >> 8);
    sdl.write(buf, 0, 2);
}

课堂演示优化建议

  • 演示前先固定播放你提前写好的315Hz单频噪声,避免环境杂波干扰检测结果
  • 把麦克风、播放噪声的扬声器、播放反相波的扬声器尽量凑近,最好放入同一个小封闭空间,减少回声对消音效果的影响
  • 可以先播放同相位的声波让学生听到音量变大,再切换成反相声波让学生听到音量变小,对比效果更直观

内容的提问来源于stack exchange,提问作者iRis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 16:36:03