【问题标题】:How to cancel background noise while playing PCM Audio in STM32?如何在STM32中播放PCM音频时消除背景噪音?
【发布时间】:2022-08-07 15:23:45
【问题描述】:

我正在尝试从 STM32(blackpill_f411ce)中的 PCM 数据播放音频。我可以听到音频,但音频也伴随着陡峭的噪音。我正在使用 Audrino 的框架在 PlatformIO 中工作。 PCM 数据在代码中定义为无符号字符数组,如下所示

unsigned char sample[98216] = {0x52, 0x49, 0x46, 0x46, 0xA0,......}

我的代码如下

#include<Arduino.h>
#include <SoundData.h>

#define OUT_PIN_STM_32 PA8
int SineValues[256];    

void InitSineValues()
{
    float ConversionFactor=(2.0*3.142)/256.0;                                           
    float RadAngle;                                     
    for(int MyAngle=0;MyAngle<256;MyAngle++)
   {
        RadAngle=MyAngle*ConversionFactor;              
        SineValues[MyAngle]=(sin(RadAngle)*127)+128;                                            
    }
}

void playPcmData()
{
  for (size_t i = 0; i < 98216; i++)
  {
    int val=int(sample[i]);
    analogWrite(OUT_PIN_STM_32,SineValues[val]);
    delayMicroseconds(50);

  }
  
}
void setup() {
  InitSineValues();
  
}
void loop() {
  playPcmData();
  delay(5000);
}

我在 ESP32 中使用了与 dacWrite 相同的代码,它运行良好。

  • 如果你使用延迟它永远不会工作:)。了解如何使用 DMA
  • @0_______ 如果您可以分享示例代码,那就太好了

标签: c++ stm32 platformio


【解决方案1】:

在设置中,我添加了analogWriteFrequency(200000)并解决了问题

void setup() {
  analogWriteFrequency(200000);
}

也不需要输入正弦值

void playPcmData()
{
  for (size_t i = 0; i < 98216; i++)
  {
    int val=int(sample[i]);
    analogWrite(OUT_PIN_STM_32,val);
    delayMicroseconds(50);

  }
}

【讨论】:

    猜你喜欢
    • 2015-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 2014-04-30
    相关资源
    最近更新 更多