请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:MSP432P401R 主题中讨论的其他器件:BOOSTXL-AUDIO
您好!
我正在开发用于实时音频处理的 DSP 应用、并且遇到了 FIR 滤波性能问题。 我的设置的工作原理是根据计时器对 ADC14进行采样、进行滤波、然后将输出写入 DAC。 当没有完成滤波时(本质上是采样、然后立即回放样本)、应用就能完美工作、但是当我添加滤波功能时、系统似乎无法跟上。
是否有人可以查看我是否做了错误的事情、或将我指向一些示例代码? 这是作为演示开发的、因此我宁愿手动实施它、而不是使用内置的 DSP 库。
//定点 FIR 服务例程 Int16_t FIR (const uint8_t M、const int16_t* fir、int16_t* buffer、 uint8_t* buffer_index、const int16_t x){ uint8_t i;// cefir int8_t buffer p; // index = * buffer =/index * buffer_t =*、* buffer_t =*、* int8_t buffer =*、*、int_t buffer *、int8、int_index = t*、buffer_t =*、buffer =*、 //将缓冲区换行并更新 为(acac=0、p=*buffer_index、i=0;i<M;i++){ if (p<0){p += M;}//将缓冲区索引 acc +=((int32_t) fif[i])*(((int32_t) buffer[p]);//mac = 0x3fc);如果结果为0x3f acc =饱和;/c = 0x3f acc) 否则、如果(ACC <-0x40000000){ ACC =-0x40000000; } (* buffer_index)++;//递增缓冲 区返回的最旧单元格索引(int16_t)(ACC >> 16);//将结果截断 } //计时器和 ADC 例程 void TA0_N_IRQHandler (void){ if (timer_A0)(cc14_eCC14>eCC11[eout_unc );//将 dac 例程写入到全局 CC8314_eCC14_eQTL (void) //稍后更新为结果 DWT //需要为 ADC 触发更新 CCR[0]*/ TIMER_A0->CCR[0]+= GLOBAL_PERIOD; TIMER_A0->CCR[1]+= GLOBAL_PERIOD; TIMER_A0->CCTL[1]; =~CCIFG;} void ADC14_IRQHandler (void )=GLOBAL (void 14)/CCTL[1]&= CCTL[1];}}void ADC14_MCL[void ADC14 (void (void)= ADC14 (void)= ADC14 (void)(void)(void (void)(void CS->KEY = CS_KEY_VAL;//Unlock CS 寄存器 CS->CTL0 = CS_CTL0_DCOEN | CS_CTL0_DCORSEL_5;//选择48MHz 时钟速度 CS->CTL1 = CS_CTL1_SELS _3 | CS_CTL1_SELM_3;//使用 DCOCLK 作为 MCLK、SMCLK + HSMCLK 的源 CS->KEY = 0; //重新锁定 CS 寄存器 }
我包括了这样的情况、即我不执行任何滤波、但当我向计时器中断添加 FIR 服务例程时、会发生故障。 当我将滤波器输出返回到不是写入样本的值时、它甚至会失败(将滤波器输出转移到虚拟值、并无论如何将原始样本写入 DAC)。
谢谢、
Thomas