完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我配置 SPU 对来自 RIF 的输入数据进行 256 点范围的 FFT,然后比较 SPU 和其他 FFT 库(Python numpy.fft)的 FFT 结果。
对于下图中的某些输入数据,上图是噪声波动较小的时域信号,ADC 值在 1750 到 2000 之间变化。 下图是 SPU 和 numpy.fft 的 FFT 结果、 而且它们彼此吻合得非常好,我们只能看到一条绿线。 (除了 0 号仓的一个点)。 这表明整个设置和 SPU 配置是正确的。 但是,对于下图中波动较大的输入数据(噪声 + 100kHz 正弦波,ADC 值在 1920 到 2120 之间变化),SPU(红线)和 numpy.fft(绿线)的 FFT 差异很大。 SPU 结果显示本底噪声要高得多。 此外,如果我进一步增加输入振幅,如下图所示(ADC 值从 1400 到 2600 不等),SPU 结果的本底噪声竟然降低了,但 100kHz 频率的振幅也降低了,并且出现了一些伪频率成分。 下面是我的 SPU 配置: /* INPUT SOURCE */ cfg->input.dataSource = IfxSpu_DataSource_rif0; cfg->input.rif.numAntennae = IfxSpu_Num_Antennae_2; cfg->input.rif.dataFormat = IfxSpu_InputDataFormat_real; cfg->input.rif.dataType = IfxSpu_InputDataType_unsigned; cfg->input.rif.sampleCount = 256; cfg->input.rif.numRamps = 256; IfxSpu_setupInput(slot, cfg->input); /* BIN-REJECtiON */ cfg->binrej.mode = IfxSpu_BinRejection_Mode_reject; cfg->binrej.numAllowedBins = 128; cfg->binrej.thresholdEnabled = FALSE; cfg->binrej.thresholdValue = 0xFFFFu; IfxSpu_setupBinRejection(slot, cfg->binrej); IfxSpu_PassId passId = IfxSpu_PassId_0; IfxSpu_PassConfig *pcfg = cfg->pass[passId]; /* MATH 1 */ pcfg->math1.loaderExponent = 5; pcfg->math1.numDropFirstSamples = 0; pcfg->math1.numDropLastSamples = 0; pcfg->math1.numPadFrontSamples = 0; pcfg->math1.window.enabled = FALSE; pcfg->math1.window.dataFormat = IfxSpu_WindowDataFormat_real16; pcfg->math1.window.baseAddress = IFX_OFFSETOF(SPU_Cmem0_Map_t, rWndw); for (antNr = 0; antNr < RADAR_NUM_RX; antNr++) { pcfg->math1.window.antennaOffsets[antNr] = 0; } pcfg->math1.phaseShift = IfxSpu_PhaseShift_0; IfxSpu_setupMath1(slot, passId, pcfg->math1); /* FFT ENGINE UNLOADER */ pcfg->fft.enabled = TRUE; pcfg->fft.inversed = FALSE; pcfg->fft.size = IfxSpu_getSizeCode(RADAR_FFT1_LEN); pcfg->fft.dataFormat = IfxSpu_FftDataFormat_complex32Bit; pcfg->fft.exponent = 0; pcfg->fft.forceToReal = FALSE; IfxSpu_setupFft(slot, passId, pcfg->fft); /* FFT OUTPUT */ pcfg->fftOut.enabled = TRUE; pcfg->fftOut.baseAddress = IFX_OFFSETOF(SPU_Emem_Map_t, fft_range); pcfg->fftOut.format = IfxSpu_ODP_Format_complexHalfFloat; pcfg->fftOut.exponent = 16; pcfg->fftOut.inPlace = FALSE; IfxSpu_setupFftOutput(slot, passId, pcfg->fftOut); 我尝试更改math1.loaderExponent从 0 到 18,只能改变 FFT 结果的比例,并不能解决问题。 我还尝试更改fftOut.exponent、 但没有任何效果。 |
|
相关推荐
1个回答
|
|
当输入振幅较大时,SPU FFT结果似乎无效的原因可能有以下几点:
1. 量化误差:当输入信号的振幅较大时,ADC(模数转换器)可能会受到量化误差的影响。量化误差会导致信号失真,从而影响FFT结果的准确性。为了减小量化误差,可以尝试提高ADC的分辨率或使用更高精度的ADC。 2. 信号过载:如果输入信号的振幅超过了ADC的测量范围,信号可能会被削波或饱和,导致FFT结果失真。为了避免这种情况,需要确保输入信号在ADC的测量范围内。 3. 采样率不足:根据奈奎斯特采样定理,为了避免混叠现象,采样率应至少是信号最高频率的两倍。如果采样率不足,FFT结果可能会出现错误。请检查采样率是否满足要求。 4. 窗函数选择:在进行FFT之前,通常会对信号进行窗函数处理,以减小频谱泄露。不同的窗函数对信号的影响不同,可能会影响FFT结果。可以尝试使用不同的窗函数,如汉宁窗、汉明窗等,以获得更准确的FFT结果。 5. 算法实现差异:SPU和numpy.fft可能采用了不同的FFT算法实现,这可能导致结果之间的差异。可以尝试比较两者的算法实现,以确定是否存在差异。 6. 浮点精度问题:在数字信号处理中,浮点精度问题可能会导致结果的误差。请检查SPU和numpy.fft的浮点精度设置,确保它们之间的一致性。 为了解决这些问题,可以尝试以下方法: 1. 优化ADC设置,提高分辨率和测量范围。 2. 确保采样率满足奈奎斯特采样定理的要求。 3. 尝试使用不同的窗函数,以减小频谱泄露。 4. 比较SPU和numpy.fft的FFT算法实现,确保它们的一致性。 5. 检查浮点精度设置,确保两者之间的一致性。 通过以上方法,可以提高SPU FFT结果的准确性,使其在输入振幅较大时也能获得有效的结果。 |
|
|
|
只有小组成员才能发言,加入小组>>
TLE9879_BLDC电机启动需要用手拨一下才能转动,怎么解决?
2957 浏览 2 评论
3992 浏览 9 评论
请问TLE5012B_E1000 启动后为什么位置不能正确获取
3469 浏览 9 评论
1126 浏览 8 评论
3405 浏览 7 评论
284浏览 2评论
136浏览 2评论
248浏览 2评论
TLE9879_BLDC电机启动需要用手拨一下才能转动,怎么解决?
2972浏览 2评论
如果是打开已有的dave工程,怎么查看这个工程选择的mcu型号?
283浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-1 08:33 , Processed in 0.777796 second(s), Total 81, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191