秃头老弟 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日

悬赏问题

  • ¥15 征集Python提取PDF文字属性的代码
  • ¥15 有偿求苍穹外卖环境配置
  • ¥15 代码在keil5里变成了这样怎么办啊,文件图像也变了,
  • ¥20 Ue4.26打包win64bit报错,如何解决?(语言-c++)
  • ¥15 clousx6整点报时指令怎么写
  • ¥30 远程帮我安装软件及库文件
  • ¥15 关于#自动化#的问题:如何通过电脑控制多相机同步拍照或摄影(相机或者摄影模组数量大于60),并将所有采集的照片或视频以一定编码规则存放至规定电脑文件夹内
  • ¥20 深信服vpn-2050这台设备如何配置才能成功联网?
  • ¥15 Arduino的wifi连接,如何关闭低功耗模式?
  • ¥15 Android studio 无法定位adb是什么问题?