float THD,V[5]; u32 VMaxIndex; void CalcTHD(float *dat) { arm_mult_f32(dat,(float *)flatTop1024_TAB,fft_inputbuf,ADC_Buffer_Size); //int i; //for(i=0;i<ADC_Buffer_Size;i++) //{ // fft_inputbuf[i]=dat[i]*flatTop1024_TAB[i]; //} arm_rfft_fast_f32_app(fft_inputbuf); //计算峰峰值 fft_inputbuf[0] = 0;//用于去除直流分量 arm_max_f32(fft_inputbuf,ADC_Buffer_Size/2,V+0,&VMaxIndex);//进行傅里叶变换 if(VMaxIndex<20){ THD=-1; return; }else if(VMaxIndex>102){ THD=-3; return; } V[1]=findMax(fft_inputbuf+VMaxIndex*2-2,fft_inputbuf+VMaxIndex*2+3); V[2]=findMax(fft_inputbuf+VMaxIndex*3-2,fft_inputbuf+VMaxIndex*3+3); V[3]=findMax(fft_inputbuf+VMaxIndex*4-2,fft_inputbuf+VMaxIndex*4+3); V[4]=findMax(fft_inputbuf+VMaxIndex*5-2,fft_inputbuf+VMaxIndex*5+3); THD=sqrtf(V[1]*V[1]+V[2]*V[2]+V[3]*V[3]+V[4]*V[4])/V[0]; }

时间: 2024-04-16 12:25:36 浏览: 14
这段代码是用于计算总谐波失真(Total Harmonic Distortion,THD)的函数。具体流程如下: 1. 定义了一个浮点型变量THD和一个长度为5的浮点型数组V,用于存储计算结果。 2. 定义了一个无符号整型变量VMaxIndex,用于记录峰值的索引。 3. 定义了一个名为CalcTHD的函数,该函数用于计算THD。 4. 在函数内部,使用arm_mult_f32函数将输入数据(dat)与flatTop1024_TAB数组进行逐元素相乘,结果存储到fft_inputbuf数组中。 5. 调用arm_rfft_fast_f32_app函数对fft_inputbuf数组进行快速傅里叶变换。 6. 将fft_inputbuf数组中的第一个元素置为0,用于去除直流分量。 7. 使用arm_max_f32函数找到fft_inputbuf数组中的最大值,并将最大值存储到V数组的第一个元素中,并记录其索引到VMaxIndex变量中。 8. 根据VMaxIndex的值,计算V数组的其他元素,即找到VMaxIndex的2倍、3倍、4倍和5倍位置上的峰值,并存储到对应的V数组元素中。 9. 计算THD,即将V数组中除第一个元素外的平方和开根号后除以第一个元素,并将结果存储到THD变量中。 需要注意的是,代码中有一些注释掉的部分,可能是以前的实现或调试代码,被注释掉的部分不参与计算。如果VMaxIndex小于20,则将THD置为-1;如果VMaxIndex大于102,则将THD置为-3。最后,函数执行完毕,THD的值即为计算结果。 如果您有其他问题,请随时提问。
相关问题

写一个STM32 C语言通过ADC采样计算THD的重新

下面是一个使用 STM32 的 C 语言编写的通过 ADC 采样计算 THD 的示例代码: ```c #include "stm32f4xx.h" #include "arm_math.h" #define ADC1_DR_ADDRESS ((uint32_t)0x4001204C) void ADC1_Init(void); void TIM2_Init(void); void GPIO_Init(void); void NVIC_Configuration(void); void Delay(__IO uint32_t nCount); void CalculateTHD(void); __IO uint16_t ADC1ConvertedValue[1024]; uint32_t SampleCount = 1024; uint32_t THD = 0; float32_t harmonic[51]; float32_t signal[1024]; int main(void) { ADC1_Init(); TIM2_Init(); GPIO_Init(); NVIC_Configuration(); while (1) { CalculateTHD(); } } void ADC1_Init(void) { ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; DMA_InitTypeDef DMA_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStructure); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfConversion = 1; ADC_Init(ADC1, &ADC_InitStructure); ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_3Cycles); ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE); DMA_InitStructure.DMA_Channel = DMA_Channel_0; DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_ADDRESS; DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&ADC1ConvertedValue; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; DMA_InitStructure.DMA_BufferSize = SampleCount; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_Init(DMA2_Stream0, &DMA_InitStructure); DMA_Cmd(DMA2_Stream0, ENABLE); ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE); ADC_Cmd(ADC1, ENABLE); ADC_DMACmd(ADC1, ENABLE); ADC_SoftwareStartConv(ADC1); } void TIM2_Init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); TIM_TimeBaseStructure.TIM_Period = 999; TIM_TimeBaseStructure.TIM_Prescaler = 83; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_Cmd(TIM2, ENABLE); } void GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOD, &GPIO_InitStructure); } void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } void DMA2_Stream0_IRQHandler(void) { GPIO_SetBits(GPIOD, GPIO_Pin_14); DMA_ClearITPendingBit(DMA2_Stream0, DMA_IT_TC); } void Delay(__IO uint32_t nCount) { while (nCount--) { } } void CalculateTHD(void) { uint32_t i, j; float32_t maxValue = 0.0; float32_t squaredSum = 0.0; float32_t rmsValue = 0.0; for (i = 0; i < SampleCount; i++) { signal[i] = (float32_t)ADC1ConvertedValue[i] / 4095.0 * 3.3; } arm_rms_f32(signal, SampleCount, &rmsValue); for (j = 1; j <= 50; j++) { maxValue = 0.0; for (i = 0; i < SampleCount; i++) { harmonic[j] = harmonic[j] + signal[i] * arm_sin_f32(2.0 * PI * j * i / SampleCount); } harmonic[j] = harmonic[j] * 2.0 / SampleCount; for (i = 0; i < SampleCount; i++) { squaredSum = squaredSum + arm_power_f32((signal[i] - harmonic[j] * arm_sin_f32(2.0 * PI * j * i / SampleCount)), 2.0); } THD = THD + (uint32_t)(100 * (arm_sqrt_f32(squaredSum / SampleCount) / rmsValue)); } THD = THD / 50; Delay(100); } ``` 该示例代码使用了 STM32 的 ADC 和 DMA 功能,采样 1024 个数据点,并通过计算得到了 THD 的值。该函数的实现过程如下: 1. 初始化 ADC 和 DMA,使其能够采样并存储数据。 2. 循环采样数据,计算其 RMS 值和谐波分量。 3. 计算 THD 值。 在计算 THD 值时,我们首先计算了每个谐波分量的值,然后计算了每个数据点与谐波分量之间的差值的平方和。最后,我们计算了 RMS 值并将其用作基准来计算 THD 值。 请注意,该示例代码仅供参考,并且可能需要根据你的具体应用场景进行修改。

查找 sql server 表dbo.THD04_RawData 表中EndTime列最新的记录

要查找SQL Server表dbo.THD04_RawData中EndTime列的最新记录,可以使用以下查询: ```sql SELECT TOP 1 * FROM dbo.THD04_RawData ORDER BY EndTime DESC; ``` 这条查询语句使用了TOP 1来限制结果集只返回一条记录,并按照EndTime列的降序进行排序。这样,返回的结果将是EndTime列值最大(也就是最新)的记录。 请注意,这里假设dbo.THD04_RawData表中的EndTime列是用于存储日期时间值的列。如果EndTime列是字符串类型,排序可能会不正确。在这种情况下,您可能需要先将其转换为日期时间类型,然后再进行排序。

相关推荐

最新推荐

recommend-type

CJC5340/4344ADC、DAC,替换CS5340数模转换器,100dB192KHz多位音频A/D转换器,音频Codec

4. 88分贝THD+N¨ 5.77mW功耗¨ 6.高通滤波器去除直流偏移¨ 7.模拟/数字核心供应从3V到3.6V¨ 8.支持逻辑水平从3V到3.6V¨ 9.自动检测模式选择从模式¨ 10.自动检测MCLK分割 General Description CJC5340是一个完整...
recommend-type

Python零基础30天速通(小白定制版)(完结)

宣导片:开启Python进阶之路 30动漫番剧播放量影响因素分析1综合案例 29小红书卖货实力与用户分析1综合案例 28星巴克门店探索|Matplotlib实战 27詹姆斯哈登的制胜宝典1 Panads的使用 26一晚5万的酒店| Numpy的使用 25揭开数据分析的面纱1数据分析"三剑客"概述 24虎牙直播数据告诉你谁最火1案例篇 23我的音乐我做主1数据保存之csv和excel 22电竟| BeautifulSoup解析HTML 21对李焕英的评价1HTML基础 20我的美食我做主1爬虫介绍、requests请 19看我四十二变1内容提取和格式转换 18我的版权我做主1PDF就是这么帅 17婚礼策划师离不开你|亲爱的PPT 16运营部的烦恼1战胜Excel 15Up主的创作之路1 Python与word初次 14你的offer之选|邮件发送 13我的存在只为悦你1 Pillow图片处理 12你喜欢的电竟赛事大全1 Python的文件操作 11哈利波特的魔法棒|模块 10龙珠之赛亚人1面向对象基础 09大吉大利今晚吃鸡1特种兵的战场(项目案
recommend-type

20240519基本完整

20240519基本完整
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

解答下列问题:S—>S;T|T;T—>a 构造任意项目集规范族,构造LR(0)分析表,并分析a;a

对于这个文法,我们可以构造以下项目集规范族: I0: S -> .S S -> .T T -> .a I1: S -> S. [$ T -> T. [$ I2: S -> T. I3: S -> S.;S S -> S.;T T -> T.;a 其中,点(.)表示已经被扫描过的符号,;$表示输入串的结束符号。 根据项目集规范族,我们可以构造出LR(0)分析表: 状态 | a | $ ---- | - | - I0 | s3| I1 | |acc I2 | | 其中s3表示移进到状态3,acc表示接受。在分析字符串a;a时,我们可以按照以下步骤进行
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依
recommend-type

实现实时监控告警系统:Kafka与Grafana整合

![实现实时监控告警系统:Kafka与Grafana整合](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X2pwZy9BVldpY3ladXVDbEZpY1pLWmw2bUVaWXFUcEdLT1VDdkxRSmQxZXB5R1lxaWNlUjA2c0hFek5Qc3FyRktudFF1VDMxQVl3QTRXV2lhSWFRMEFRc0I1cW1ZOGcvNjQw?x-oss-process=image/format,png) # 1.1 Kafka集群架构 Kafka集群由多个称为代理的服务器组成,这