秃头老弟 2023-10-14 11:10 采纳率: 0%
浏览 8

PCM数据变成分呗问题

使用单片机i2s采集出数字硅麦(inmp441)的数据,数据格式为24位的PCM数据。我是这样处理数据的

img

这样val32就是声音的振幅,然后通过串口打印出来看数据波形,说话有明显的波动。如下图

img

通过求振幅平均值,然后调用公式DB=20*log10(sum)计算出分呗,如下图代码

img

上面计算的分呗虽然是根据声音变化了,但是低噪声环境中,计算的分呗值跳动很大。用这个算法虽然能出分贝值,但是值变化太大不准,我还加入了滤波,也不行。
第二个算法均方根
就是把振幅用均方根公式进行计算

img

计算出来的振幅也不尽人意,跳动跟第一种没啥区别

所以有没有懂数据音频数据处理的能给点思路,有什么算法可以解决这个问题

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-10-14 14:17
    关注

    【以下回答由 GPT 生成】

    我可以给出一些建议来优化PCM数据的分贝计算算法。请注意以下几点:

    1. 选择合适的滤波器:为了减少噪声对分贝计算的影响,可以尝试使用数字滤波器。选择合适的滤波器类型和参数,以删除不需要的高频噪声。这可能需要进行一些频率分析和试验来确定最佳的滤波器设置。

    2. 采样率和帧大小:在采集PCM数据时,请确保选择合适的采样率和帧大小。通过增加采样率和帧大小,你可以获得更准确的结果。然而,需要平衡系统资源和计算复杂性。

    3. 适当的数据处理:在处理PCM数据时,确保正确处理和规范化数据。尽可能避免数据溢出和截断错误。

    4. 动态范围压缩:使用动态范围压缩技术,可以在保持较高音质的同时减少噪声的影响。这对于在低噪声环境下计算分贝值很有帮助。

    5. 参考已有音频算法:有许多已有的音频算法可以用于处理和分析音频数据。例如,Fast Fourier Transform (FFT) 可以帮助你在频域中分析数据。参考这些算法并根据你的需求进行适当修改。

    以下是示例代码的更新,用于添加滤波器和动态范围压缩:

    // 引入滤波器库(这里以FIR滤波器为例)
    #include <fir_filter.h>
    
    // 初始化滤波器
    FIRFilter filter;
    filter.setCoefficients(coefficients);  // 根据需求设置滤波器系数
    
    // 应用滤波器
    for (int i = 0; i < numSamples; i++) {
        val32[i] = filter.process(val32[i]);
    }
    
    // 动态范围压缩
    float maxAmplitude = getMaxAmplitude(val32, numSamples);  // 获取数据的最大振幅
    for (int i = 0; i < numSamples; i++) {
        val32[i] /= maxAmplitude;  // 将振幅归一化到范围[-1, 1]
        val32[i] = compress(val32[i]);  // 使用压缩函数进行动态范围压缩
    }
    
    // 算法1: 平均振幅
    float sum = 0;
    for (int i = 0; i < numSamples; i++) {
        sum += abs(val32[i]);
    }
    float db = 20 * log10(sum);
    
    // 算法2: 均方根
    float rms = 0;
    for (int i = 0; i < numSamples; i++) {
        rms += val32[i] * val32[i];
    }
    rms /= numSamples;
    rms = sqrt(rms);
    

    记住,这只是一些建议,具体的优化方法可能需要根据你的需求和实际情况进行调整和修改。希望这些建议能帮助到你。如果你有其他问题,请随时提问。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 10月14日

悬赏问题

  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境
  • ¥30 关于#java#的问题,请各位专家解答!
  • ¥30 vue+element根据数据循环生成多个table,如何实现最后一列 平均分合并
  • ¥20 pcf8563时钟芯片不启振
  • ¥20 pip2.40更新pip2.43时报错
  • ¥15 换yum源但仍然用不了httpd
  • ¥50 C# 使用DEVMOD设置打印机首选项
  • ¥15 麒麟V10 arm安装gdal