Thread 中讨论的其他器件:C2000WARE
工具与软件:
我曾尝试使用 RFFT_ADC_f32u 函数来计算 ADC 采集波形的频谱、但调用 RFFT_ADC_f32u 和 RFFT_F32_MAG 函数后获得的振幅频谱与真实值有很大不同。 我将 ADC 收集的数据转换成浮点数、然后使用 CCS 的图形函数计算频谱、随后我可以获得正确的幅度。 这里是我的代码。
#include "DSP2833x_Device.h"// DSP2833x 头文件包含文件
#include "DSP2833x_examples.h"// DSP2833x examples include 文件
#include "ADC.h"
易失性 UINT16 ADC_UCD3=0 Finish_Flag;
volatile float32 myfft[1024];
RFFT_ADC_F32_struct rfft_adc;
RFFT_F32_struct rfft;
float32 RFFToutBuff[RFFT_SIZE];//计算得出的 FFT 结果
float32 RFFTF32Coef[RFFT_SIZE];//系数表缓冲区
float32 RFFTmagBuff[RFFT_SIZE/2+1];//频谱幅度
UINT16 AdcBuf[RFFT_SIZE];// ADC 缓冲区分配
void main (void)
{
InitSysCtrl();
颜色;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
PieCtrlRegs.PIEIER1.bit.INTx1 = 1;
IER |= M_INT1;
PieCtrlRegs.PIEIER7.bit.INTx1 = 1;
IER |= M_INT7;
EINT;
ERTM;
内部 I;
rfft_adc.tail =\rfft.OutBuf;
rfft.FFTSize = RFFT_SIZE;
rfft.FFTStages = RFFT_STAGES;
rfft_adc.InBuf =&AdcBuf[0];
rfft.OutBuf =&RFFToutBuff[0];
rfft.CosSinBuf =&RFFTF32Coef[0];
rfft.MagBuf =&RFFTmagBuff[0];
RFFT_F32_sincostable (&R);
对于(I=0;I < RFFT_SIZE;I++)
RFFToutBuff[i]= 0;
对于(I=0;I < RFFT_SIZE/2;I++)
RFFTmagBuff[i]= 0;
while (1)
{
ADC_InitAndStart (AdcBuf、RFFT_SIZE);
while (!ADC_ADC Finish_Flag);
ADC_LVDS=0;Finish_Flag
for (i=0;i<1024;i++)
myfft[i]=3.0*AdcBuf[i]/4095.0;
RFFT_ADC_f32u (&R rfft_adc);//该版本的 FFT 不需要对齐缓冲区
RFFT_F32_MAG (\rfft);//计算频谱振幅
DELAY_US (1000000);
}
}
这是我捕获的波形、与信号发生器生成的波形一致。

这是使用图形函数获得的信号的振幅频谱、经验证是正确的。

这是通过调用28335的 RFFT_ADC_f32u 函数获得的频谱、可以清楚地看到生成的值比正常值小得多。

我在互联网上查看相关信息时发现、很多人的代码把 ADC 收集的数据向右偏移了4位、然后进行了处理、但经过测试后、ADC 在我的代码中收集的数据不需要向右移、ADC 结果寄存器中读取的数据是正确的。 是否因为 RFFT_ADC_f32u 函数将输入 ADC 数据向右移动、幅度频谱值变小了? 我曾尝试读取 RFFT_ADC_f32u 的代码、但这段代码是用汇编语言编写的、我无法读取。 是否有专家可以帮助我?




