找回密码
 立即注册

QQ登录

只需一步,快速开始

打印 上一主题 下一主题
开启左侧

[M051] 如何产生频率连续可调的方波?

[复制链接]
楼主
eeyrw 发表于 2015-5-23 21:26:01 | 显示全部楼层
其实可以考虑下DDS合成算法,用单个方波做波表。
回复 支持 反对

使用道具 举报

沙发
eeyrw 发表于 2015-5-27 13:50:36 | 显示全部楼层
本帖最后由 eeyrw 于 2015-5-27 13:54 编辑
  1. // 凑合看看吧,这个好象是可以同时合成多个波叠加的。。
复制代码
  1. #include "sineTable.h"
  2. #include "dds.h"

  3. #define DDS_FRAME_SIZE 2000
  4. #define DDS_UNITS_NUM 16

  5. STEREO_SAMPLE ddsFrameSample0[DDS_FRAME_SIZE];
  6. STEREO_SAMPLE ddsFrameSample1[DDS_FRAME_SIZE];


  7. DDS_CFG ddsCfg[DDS_UNITS_NUM];


  8. void DdsInitCfg(DDS_CFG* ddsCfg)
  9. {
  10.         ddsCfg->cst1=0xFFFFFFFF/ddsCfg->sampleRate;
  11. }
  12. void DdsChangeFreq(uint32_t freq,uint32_t chn)
  13. {

  14.         ddsCfg[chn].desireFreq=freq;


  15. }
  16. void DdsInit(void)
  17. {
  18.         uint32_t i;
  19.         for(i=0; i<DDS_UNITS_NUM; i++)
  20.         {
  21.                 ddsCfg[i].desireFreq=0;
  22.                 ddsCfg[i].phaseAccReg=0;
  23.                 ddsCfg[i].sampleRate=44100;

  24.                 DdsInitCfg(&ddsCfg[i]);
  25.         }

  26.         SoundBufferAssign((uint32_t)ddsFrameSample0,DDS_FRAME_SIZE*4,(uint32_t)ddsFrameSample1,DDS_FRAME_SIZE*4);
  27. }

  28. void PhaseAccRegUpdate(DDS_CFG* ddsCfg)
  29. {
  30.         ddsCfg->phaseAccReg=ddsCfg->desireFreq*ddsCfg->cst1+ddsCfg->phaseAccReg;
  31. }

  32. void DdsPeriodRoutine(void)
  33. {
  34.         uint32_t i,j;

  35.         uint32_t* rawBufPtr;

  36.         int16_t* samplePtr;

  37.         int32_t res;

  38.         uint32_t waveTableIdx=0;
  39.         int32_t waveValue;
  40.         res=SoundOpenFreeBuffer(&rawBufPtr);

  41.         if(res!=-1)
  42.         {
  43.                 samplePtr=(int16_t*)rawBufPtr;

  44.                 waveValue=0;


  45.                 for(i=0; i<DDS_FRAME_SIZE; i++)
  46.                 {
  47.                         for(j=0; j<DDS_UNITS_NUM; j++)
  48.                         {
  49.                                 PhaseAccRegUpdate(&ddsCfg[j]);

  50.                                 waveTableIdx=(ddsCfg[j].phaseAccReg>>18)&0x3FFF;
  51.                                 waveValue+=sineTbl[waveTableIdx];

  52.                         }
  53.                         waveValue/=DDS_UNITS_NUM;

  54.                         *samplePtr=waveValue;
  55.                         samplePtr++;
  56.                         *samplePtr=waveValue;
  57.                         samplePtr++;

  58.                 }
  59.                 res=SoundCloseBuffer(&rawBufPtr);
  60.         }


  61. }
复制代码



回复 支持 反对

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

新唐MCU