硬汉嵌入式论坛

 找回密码
 立即注册
查看: 192|回复: 7
收起左侧

[信号与系统] 有没有老哥用过滑动DFT和滑动戈策尔做过信号实时监测的?

[复制链接]

1

主题

12

回帖

15

积分

新手上路

积分
15
发表于 2025-7-31 14:54:29 | 显示全部楼层 |阅读模式
如题。

想实时监测一个频率的幅值做告警,但芯片的能力不够,现在用戈策尔算法获取到两个目标频率周期的采样数据后再计算实测128点的数据算完要5ms。
想要用滑动戈策尔采一次算一次但自己没折腾出来
[C] 纯文本查看 复制代码
static void CalcGoertzel(GOERTZEL_T *_p, int32_t *_pData, uint16_t _usLen)
{
	uint8_t useWinFlag = 0;
	int64_t q0 = 0, q1 = 0, q2 = 0;
	
	if(_p->index > 18)
	{
		usedWinFlag = 1;
	}

	for(uint16_t i = 0; i < _usLen; i++)
	{
		//int64_t data = (int64_t)FLOAT_TO_Q16(_pData[i]);	//Q47.16
		int64_t data = 0;
		int64_t coeff_term = ((int64_t)_p->coeff_Q15_16 * q1) >> 16;
		
		if(useWinFlag)
		{
			data = ((int64_t)_pData[i] * FaltTopWindow[i]) >> 16;
		}
		else
		{
			data = _pData[i];
		}
		
		q0 = (data) + coeff_term - q2;
		q2 = q1;
		q1 = q0;
	}
	const int64_t SCALE = 1LL << 16;
	float q1_f = (float)q1 / (float)SCALE;
	float q2_f = (float)q2 / (float)SCALE;
	
	float real = q1_f - q2_f * _p->cosVal;
	float imag = q2_f * _p->sinVal;
	
	if(useWinFlag)
	{
		_p->map *= 4.18f;
	}
	
#if USED_HANNING_WIN == 1
	_p->map = sqrtf(real * real + imag * imag) * 4 / N;
#else 
	
//#if USED_FALT_TOP_WIN == 1
//	_p->map *= 4.18f;
//#endif /* USED_FALT_TOP_WIN == 1 */
	_p->map = sqrtf(real * real + imag * imag) * 2 / N;
#endif	/* USED_HANNING_WIN == 1 */
	
	_p->map = _p->map * K_ADC;
	
	if(_p->map >= 5 && _p->map < 290)
	{
		if(_p->index > 10)
		{
			_p->map_2 = _p->map * K2 + B2;
		}
		else
		{
			_p->map_2 = _p->map * K + B;
		}
	}
	else
	{
		_p->map_2 = _p->map;
	}
	
	_p->rms = _p->map_2 / sqrtf(2.0f);
}

这个是做的定点数戈策尔
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-7-31 16:34:50 | 显示全部楼层
你这个必须用64bit变量吗,即使是STM32H7系列,使用64变量除法都要比双精度硬件浮点慢10倍。

这个地方改进下,可以大大降低速度
回复

使用道具 举报

1

主题

12

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2025-7-31 16:48:59 | 显示全部楼层
eric2013 发表于 2025-7-31 16:34
你这个必须用64bit变量吗,即使是STM32H7系列,使用64变量除法都要比双精度硬件浮点慢10倍。

这个地方改 ...

应该可以用32位的,之前是用的arm dsp库用float32做的,这里随便改了一下用来验证定点数的戈策尔算法还没做优化,现在想试一下用滑动DFT
回复

使用道具 举报

1

主题

12

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2025-7-31 16:54:21 | 显示全部楼层
eric2013 发表于 2025-7-31 16:34
你这个必须用64bit变量吗,即使是STM32H7系列,使用64变量除法都要比双精度硬件浮点慢10倍。

这个地方改 ...

用float32和arm dsp库是5ms,这个刚刚测了一下是2ms。这个64位主要还是用来装2个32位定点数的运算结果
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-8-1 08:37:47 | 显示全部楼层
StupidLED 发表于 2025-7-31 16:54
用float32和arm dsp库是5ms,这个刚刚测了一下是2ms。这个64位主要还是用来装2个32位定点数的运算结果

滑动DFT没研究过了
回复

使用道具 举报

85

主题

798

回帖

1053

积分

至尊会员

积分
1053
发表于 2025-8-1 23:06:42 | 显示全部楼层
格策尔如果不加窗,用循环迭代简直是不能再快了,用不了5ms
回复

使用道具 举报

1

主题

12

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 7 天前 | 显示全部楼层
庄永 发表于 2025-8-1 23:06
格策尔如果不加窗,用循环迭代简直是不能再快了,用不了5ms

一个频点确实不用这么久,测试的时候是采了两个通道各计算4个频点的时间。后续要采5个通道,感觉有阻塞有点严重
回复

使用道具 举报

85

主题

798

回帖

1053

积分

至尊会员

积分
1053
发表于 7 天前 | 显示全部楼层
StupidLED 发表于 2025-8-4 15:05
一个频点确实不用这么久,测试的时候是采了两个通道各计算4个频点的时间。后续要采5个通道,感觉有阻塞有 ...

空间换取时间
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-11 23:57 , Processed in 0.040144 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表