第10章 示波器设计—数字信号处理
本章节为大家讲解二代示波器中用到的FFT和FIR。单纯从应用上来说,比较省事,调用API函数即可,从学习的角度来说,需要大家花点精力。
10.1 FFT快速傅里叶变变换
10.2 FIR有限冲击响应滤波器
10.3 总结
10.1 FFT快速傅里叶变换
二代示波器中做了2048点的浮点FFT。具体实现是采用ARM的DSP库函数arm_rfft_fast_f32。
/*
*********************************************************************************************************
* 函 数名: DSO1_WaveProcess
* 功能说明: 波形通道1的FFT,FIR,最大值,最小值,平均值,峰峰值,频率和RMS的计算
* 形 参:无。
* 返 回值: 无
*********************************************************************************************************
*/
void DSO1_WaveProcess(void)
{
uint16_t i;
uint32_t uiCycle, uiCount = 0;
/* 省略其它 */
/* 自动触发模式才计算FFT */
if(TriggerFlag== 0)
{
/* 前10种采样率计算FFT */
if(TimeBaseId< 10)
{
/* 执行2048点浮点FFT运算 */
for(i=0;i<2048; i++)
{
testInput_fft_2048[i]= g_DSO1->usWaveBufTemp[i];
}
/* 2048点实序列快速FFT,浮点 */
arm_rfft_fast_f32(&S,testInput_fft_2048, testOutput_fft_2048, ifftFlag);
/* 求1204点的幅值 */
arm_cmplx_mag_f32(testOutput_fft_2048,testInput_fft_2048, 1024);
/* 获得最大的幅值和所在的位置 */
uiCycle= testInput_fft_2048[1];
for(i= 2; i < 1024; i++)
{
if(uiCycle< testInput_fft_2048[i])
{
uiCycle=testInput_fft_2048[i];
uiCount= i;
}
}
/* 估算频率 */
g_DSO1->uiFreq= uiCount * g_SampleFreqTable[TimeBaseId][0] / 2048;
}
/* 省略其它 */
}
/* 省略其它 */
}
上面的代码中对采集的2048点数据做浮点FFT处理,并求出幅频响应,方便示波器上频谱的展示。同时代码中也做了一个简单的波形频率估计,这个估计仅适合周期性的正弦波,方波。
(1)对于正弦波而言,它经过FFT后,理想的幅频响应就是一根线,所以根据这个特性,只要找出幅频响应中幅值最大的值即可,它所对应的频率位置就是波形的频率。
(2)对于方波而言,它经过FFT后,理想的幅频响应就跟手机信号一样(中间有间隔),方波是由无限多个正弦波叠加而成的,其中第一个幅值最高的就是基波,也是方波的频率。
当前提供的方法仅适合估算,要提高精度的话需要对更多的点做FFT,或者采样率正好是波形频率的整数倍,这样可以有效降低频谱泄露,准确率较高。当然,这种方法的操作难度有点大,因为我们不知道波形频率是多少,求得就是波形频率。
关于FFT的计算,大家可以直接看我们的DSP教程,有详细讲解,务必优先看第25章,对FFT变换结果的物理意义有个认识,然后再看其它章节:http://forum.armfly.com/forum.php?mod=viewthread&tid=3886。
10.2 FIR有限冲击响应滤波器
二代示波器的FIR滤波控制界面如下:
做了一个80阶低通FIR滤波器,分别可以在2Msps采样率,200Ksps采样率和20Ksps采样率下工作。每个采样率下做了7种截止频率。
FIR滤波在信号处理任务里面被调用:
/*
*********************************************************************************************************
* 函 数名: DSO1_WaveProcess
* 功能说明: 波形通道1的FFT,FIR,最大值,最小值,平均值,峰峰值,频率和RMS的计算
* 形 参:无。
* 返 回值: 无
*********************************************************************************************************
*/
void DSO1_WaveProcess(void)
{
uint16_t i;
uint32_t uiCycle, uiCount = 0;
/* 省略其它 */
/*自动触发模式才计算FFT */
if(TriggerFlag== 0)
{
/* 省略其它 */
/* 前10种采样率计算FFT */
if(TimeBaseId< 10)
{
/* 执行650点,80阶Fir滤波器 */
/*单通道2Msps */
if((TimeBaseId== 1)&&(g_DSO1->ucFirFlter_Step100KHz !=0 ))
{
DSO_FirFilter_Step100KHz();
}
/* 单通道200Ksps */
if((TimeBaseId== 4)&&(g_DSO1->ucFirFlter_Step10KHz !=0 ))
{
DSO_FirFilter_Step10KHz();
}
/* 单通道20Ksps */
if((TimeBaseId== 7)&&(g_DSO1->ucFirFlter_Step1KHz !=0 ))
{
DSO_FirFilter_Step1KHz();
}
}
}
/* 省略其它 */
}
根据不同的采样率,分别做了个处理,我们这里以函数DSO_FirFilter_Step100KHz()为例进行说明。这个函数的实现如下:
#define FIR_LENGTH_SAMPLES 650 /* 采样点数 */
#define BLOCK_SIZE 650 /* 调用一次arm_fir_f32处理的采样点个数 */
#define NUM_TAPS 81 /* 滤波器系数个数*/
#define FIR_StateBufSize BLOCK_SIZE + NUM_TAPS - 1
/*
*********************************************************************************************************
* 滤波器系数
*********************************************************************************************************
*/
/* 80阶FIR低通滤波器系数通过fadtool获取系数 Fs = 2Msps, Fc = 100KHz*/
const float32_t firCoeffs32LP_100KHz[NUM_TAPS] = {
-3.126438727e-19f,-0.0002058673272f,-0.0004228431499f,-0.0006468905485f,-0.0008642434841f,
-0.001048665727f,-0.001161655295f,-0.001156177954f,-0.0009838859551f,-0.0006050768425f,
8.391786605e-19f,0.0008203662583f, 0.00180617522f, 0.002865221584f, 0.003865677863f,
0.004645895679f, 0.005031134468f, 0.004856021609f, 0.00399050815f, 0.002366269007f,
-2.110346192e-18f,-0.002989985514f,-0.006377025973f,-0.009831513278f,-0.01293939352f,
-0.0152332196f, -0.01623356342f, -0.01549717132f, -0.01266706176f, -0.007519159f,
3.381513724e-18f, 0.009749332443f, 0.0213866625f, 0.03438147902f, 0.04804687202f,
0.06158847734f, 0.07416618615f, 0.08496309072f, 0.09325480461f, 0.09847255051f,
0.1002533659f, 0.09847255051f, 0.09325480461f, 0.08496309072f, 0.07416618615f,
0.06158847734f, 0.04804687202f, 0.03438147902f, 0.0213866625f, 0.009749332443f,
3.381513724e-18f, -0.007519159f,-0.01266706176f, -0.01549717132f, -0.01623356342f,
-0.0152332196f,-0.01293939352f,-0.009831513278f,-0.006377025973f,-0.002989985514f,
-2.110346192e-18f, 0.002366269007f, 0.00399050815f, 0.004856021609f, 0.005031134468f,
0.004645895679f, 0.003865677863f, 0.002865221584f, 0.00180617522f,0.0008203662583f,
8.391786605e-19f,-0.0006050768425f,-0.0009838859551f,-0.001156177954f,-0.001161655295f,
-0.001048665727f,-0.0008642434841f,-0.0006468905485f,-0.0004228431499f,-0.0002058673272f,
-3.126438727e-19f
};
/* 其它截止频率对应的系数未贴出 */
/*
*********************************************************************************************************
* 函 数名: DSO_FirFilter_Step100KHz
* 功能说明: FIR滤波器。
* 形 参:无
* 返 回值: 无
*********************************************************************************************************
*/
void DSO_FirFilter_Step100KHz(void)
{
arm_fir_instance_f32S;
uint16_ti;
/* 获取要滤波的数值 */
for(i =0; i < BLOCK_SIZE; i++)
{
FirDataInput[i]=g_DSO1->usWaveBufTemp[i+g_DSO1->sCurTriPos+g_DSO1->sCurTriStep];
上一篇:【二代示波器教程】第16章 附件A---电阻屏触摸校准
下一篇:隔离示波器=示波器+隔离变压器吗
推荐阅读最新更新时间:2024-11-13 10:15
- SY88903V 5V/3.3V 1.25Gbps高速限幅后置放大器典型应用
- 基于TL494的50V以上降压电路(个人)
- S8VS-12024A 24V/120W AC/DC电源典型应用
- KITDRIVER2EDN7524GTOBO1,用于 2EDN7524G EiceDRIVER 双通道非隔离栅极驱动器的评估套件
- MAXREFDES1105:借助MAX17690和MAX17606,效率为90.4%的小尺寸,5V / 2A,同步,无光耦反激式DC-DC转换器
- 具有电源排序功能的 LTC3589EUJ-2 8 输出稳压器的典型应用电路
- LT2079 的典型应用 - 微功率、双路和四路、单电源、精密运算放大器
- STEVAL-MKI176V1, LSM6DS3H 标准 DIL24 插座转接板
- 基于AS5147P的ODrive配套磁编码器
- AZ432 低压(1.25V)可调精密并联稳压器的典型应用