当前位置: 首页 > news >正文

【杂谈】STM32使用快速傅里叶变换库函数后如何比较准确地找到n次谐波幅值

目录

1.简单介绍傅里叶变换的作用

2.谐波是什么

3.解决方法


1.简单介绍傅里叶变换的作用

任何复杂的波形归根结底都是由多个频率和相位不一样的正弦波组成的

通过傅里叶变换可以找到组成一个复杂的波形的所有正弦波的频率和幅度信息

2.谐波是什么

假设有一个复杂的波形,它由多个正弦波有规律的叠加而成,且第一个正弦波频率为5KHz,第二个正弦波为10KHz,第三个正弦波为15KHz……

可以发现后续的正弦波频率都是第一个正弦波的整数倍,所以我们称第一个正弦波为基波(或一次谐波),第二个正弦波为二次谐波,以此类推

使用STM32以合适的频率对这个复杂的波形采样(用数组A存储),并将采样得到的数据利用DSP数学库中的快速傅里叶变换得到新的数据(也用数组B存储),我们该如何正确找出各谐波的幅值呢?

3.解决方法

假设基波的幅值比其他谐波的幅值都要高

我们可以先通过大小比较确定基波(一次谐波)在数组B中的下标N,当我们确定基波在数组B的下标后,由于谐波的频率必然是基波的整数倍,可以通过乘以基波下标的2倍、3倍、4倍……找到二次、三次、四次谐波……的位置是2N、3N、4N……

//假设基波的幅度高于直流分量和后续所有的谐波
//先找基波,假设B数组的长度为size
int i = 0;
int MAX_Location = 0;     //存储最大值所在位置
float MAX = B[0];         
for( i = 0; i < size; i++)
{if( B[i] > MAX ){MAX = B[i];MAX_Location = i;}
}

但这样的方法存在找不准的问题,比如二次谐波幅值实际是2V,由于采样频率问题,2倍的基波数组下标内存储的幅值只有1V,真正的二次谐波在应该在2N-1或者2N+1,那么可以通过在2N的小范围区间内再找一次最大值

当小区间内相邻两个值误差在一定范围内可视为由于采样频率的问题,其实在两者间真正的最大值没有采到,可以人为地在合适的范围修正

int i = 0;
int Number = 0;           //假设有Numer次谐波
int number = Number;
int arr[number] = {0};    //用于存储每个谐波在B数组中的下标
float correction = 30;    //人为修正刚好没有采到最大值,而是采到左右两个值的问题
float max = 0;number = 0;    
for( i = 2; i < Number; i++)	
{	max = B[Base_location * i - 2];            for( j = Base_location * i - 2; j < Base_location * i + 2; j++ )  //取±2的区间{if( fabs(arr[j] - arr[j + 1]) < 30)                           //修正{B[j] = (B[j] + B[j+1]) / 2 + 15;} if( B[j] > max ){max = B[j];arr[number] = j;number++;}}		
}

http://www.xdnf.cn/news/663499.html

相关文章:

  • Python不要使用可变对象作为函数的默认参数
  • 记忆术-拼音字母形象法【针对“音形义“里谐音法的补充记忆法】
  • 布局泰国遇网络难题?中泰跨境网络组网专线成破局关键
  • Unity中的文件读写TXT 与XML
  • java中的线程安全的集合
  • 如何用DeepSeek修改论文,防止AI幻觉?
  • 题目 3331: 蓝桥杯2025年第十六届省赛真题-LQ 图形
  • 【Axure结合Echarts绘制图表】
  • 华为OD机试_2025 B卷_返回矩阵中非1的元素个数(Python,100分)(附详细解题思路)
  • Python应用“面向对象”小练习
  • 【深度学习】4. 参数初始化详解与数学推导: Xavier, He
  • 敦普水性双组份聚氨酯面漆检验报告(SGS、重金属含量、低voc)
  • 电路中常见器件及作用(电阻 电容 电感)
  • 如何通过PHPMyadmin对MYSQL数据库进行管理?
  • IP离线库与网站集成
  • 如何在 Windows 10 PC 上获取 iPhone短信
  • MS1205N激光测距用高精度时间测量(TDC)电路
  • 火山引擎云服务器带宽支持
  • 楼宇自控成智能建筑核心技术,提升节能效率,构筑绿色发展新优势
  • 多查询检索在RAG中的应用及为什么平均嵌入向量效果好
  • C/C++内存泄漏深度解析与系统化解决方案
  • 工业级应用:Halcon灰度直方图核心技术全解
  • 数据的获取与读取篇---常见的数据格式CSV
  • uv使用教程
  • Agilent安捷伦Cary3500 UV vis光谱仪Cary60分光光度计Cary1003004000500060007000 UV visible
  • 【STM32开发板】电源设计原理
  • Typescript学习教程,从入门到精通,TypeScript 名称空间与模块语法知识点及案例(14)
  • 前缀和实现题目:区域和检索 - 数组不可变
  • 第2章(新)Day2 - Python基础入门
  • 【图论 并集查找】P3671 [USACO17OPEN] Where‘s Bessie? S|普及+