14浏览
查看: 14|回复: 1

[项目] 【花雕动手做】CanMV K230 AI视觉模块之使用傅里叶变换

[复制链接]
傅里叶变换(Fourier Transform)是信号处理、数学和物理学领域的核心工具,通过将信号从时域转换到频域,揭示其频率成分。以下是关于傅里叶变换的具体介绍:

1、基本原理
核心思想
任何信号(无论是周期性还是非周期性)都可以表示为不同频率的正弦波或余弦波的叠加。
数学表达
连续傅里叶变换(FT):对于连续函数f(t),其频域表示为
F(ω)=∫ −∞ ∞ f(t)e −j2πωt dt,其中ω为角频率。
离散傅里叶变换(DFT):针对离散信号f[n],公式为
F[k]=∑ n=0 N−1 f[n]e −j2πkn/N,
k为频率索引3。
快速傅里叶变换(FFT):一种高效计算DFT的算法,复杂度从O(N 2 )降至O(NlogN),广泛应用于工程实践。
主要类型
连续与离散形式
连续傅里叶变换适用于模拟信号,而离散形式(DFT/FFT)用于数字信号处理。
逆变换
从频域恢复时域信号,例如IDFT公式为
f[n]= N1∑ k=0 N−1 F[k]e j2πkn/N 。

2、应用领域
信号处理
噪声去除:通过滤除高频成分(噪声通常为高频)平滑数据。
特征提取:识别周期性信号的频率(如周期性干扰)。
适用性:适合分析时间序列数据的频率特性,平滑噪声或提取周期性模式。
图像处理与计算机视觉
频域滤波:低通滤波保留平滑区域,高通滤波增强边缘。
压缩技术:JPEG利用离散余弦变换(DCT,傅里叶变种)量化高频分量。
模式识别:频域模板匹配提升物体检测效率。
物理与工程
量子力学:波函数在坐标空间与动量空间的转换依赖傅里叶变换。
光学建模:几何傅里叶变换优化强相位波前的快速计算,应用于衍射模拟。
电路分析:谐波分析法处理非正弦交流电。
总之,傅里叶变换不仅是一种数学工具,更是连接理论与应用的桥梁。其核心价值在于将复杂问题转化为频域中的可操作问题,从而在众多领域中实现高效分析与优化。

【花雕动手做】CanMV K230 AI视觉模块之使用傅里叶变换图1

【花雕动手做】CanMV K230 AI视觉模块之使用傅里叶变换图2

【花雕动手做】CanMV K230 AI视觉模块之使用傅里叶变换图3

驴友花雕  中级技神
 楼主|

发表于 昨天 17:16

【花雕动手做】CanMV K230 AI视觉模块之傅里叶变换

【花雕动手做】CanMV K230 AI视觉识别模块之使用傅里叶变换
项目测试实验代码

  1. #【花雕动手做】CanMV K230 AI视觉识别模块之使用傅里叶变换         
  2. # 项目功能:演示在嵌入式设备上使用FFT进行频域信号分析
  3. # 导入必要的模块
  4. from machine import FFT  # 硬件加速的FFT模块,提供快速傅里叶变换功能
  5. import array  # 数组模块,用于高效数值计算
  6. import math   # 数学函数模块
  7. from ulab import numpy as np  # 嵌入式设备优化的numpy库,提供数组操作
  8. """
  9. 傅里叶变换(Fourier Transform)是一种将时域信号分解为不同频率正弦波的叠加的数学方法。
  10. 它可以帮助我们分析信号中包含的频率成分。FFT(快速傅里叶变换)是一种高效计算傅里叶变换的算法。
  11. The Fourier Transform is a mathematical method that decomposes a time-domain signal into
  12. the sum of sinusoidal waves of different frequencies. It helps us analyze the frequency
  13. components contained in a signal. FFT (Fast Fourier Transform) is an efficient algorithm
  14. for computing the Fourier transform.
  15. 技术要点 | Technical Points:
  16. 1. 时域到频域:将信号从时间维度转换到频率维度
  17. 2. 频谱分析:识别信号中的主要频率成分
  18. 3. 应用场景:音频处理、振动分析、通信系统、图像处理等
  19. 4. 硬件加速:K230的FFT模块使用专用硬件提高计算效率
  20. """
  21. # 定义圆周率常量
  22. # Define PI constant
  23. PI = 3.14159265358979323846264338327950288419716939937510
  24. class SignalProcessor:
  25.     def __init__(self, num_points=64):
  26.         """
  27.         初始化信号处理器
  28.         Initialize signal processor
  29.         
  30.         Args:
  31.             num_points: FFT点数,必须是2的幂次(32, 64, 128, 256等)
  32.             FFT points, must be power of 2 (32, 64, 128, 256, etc.)
  33.             
  34.         重要参数说明 | Important Parameters:
  35.         - num_points: 决定频率分辨率和计算复杂度
  36.         - 点数越多,频率分辨率越高,但计算量越大
  37.         """
  38.         self.num_points = num_points
  39.         self.data = []  # 存储时域信号数据
  40.    
  41.     def generate_test_signal(self):
  42.         """
  43.         生成测试信号 - 包含5个不同频率的余弦波叠加
  44.         Generate test signal - sum of 5 cosine waves with different frequencies
  45.         
  46.         信号构成 | Signal Composition:
  47.         - 5个不同频率和幅值的余弦波叠加
  48.         - 用于验证FFT能够正确识别各个频率成分
  49.         - 实际应用中可替换为真实的传感器数据
  50.         """
  51.         self.data = []  # 清空数据
  52.         for i in range(self.num_points):
  53.             # 生成5个不同频率、不同幅值的余弦波
  54.             # Generate 5 cosine waves with different frequencies and amplitudes
  55.             
  56.             # 基础频率成分 - 1倍频
  57.             data0 = 10 * math.cos(2 * PI * i / self.num_points)      # 幅值10,基波
  58.             
  59.             # 二次谐波 - 2倍频  
  60.             data1 = 20 * math.cos(2 * 2 * PI * i / self.num_points)  # 幅值20,二次谐波
  61.             
  62.             # 三次谐波 - 3倍频
  63.             data2 = 30 * math.cos(3 * 2 * PI * i / self.num_points)  # 幅值30,三次谐波
  64.             
  65.             # 高频小信号 - 4倍频
  66.             data3 = 0.2 * math.cos(4 * 2 * PI * i / self.num_points) # 幅值0.2,高频小信号
  67.             
  68.             # 强高频信号 - 5倍频
  69.             data4 = 1000 * math.cos(5 * 2 * PI * i / self.num_points)# 幅值1000,强高频信号
  70.             
  71.             # 将所有波形叠加,生成复合信号
  72.             # Sum all waves together to create composite signal
  73.             composite_signal = data0 + data1 + data2 + data3 + data4
  74.             
  75.             # 转换为整数并存储(模拟ADC采样)
  76.             # Convert to integer (simulating ADC sampling)
  77.             self.data.append(int(composite_signal))
  78.         
  79.         print(f"生成测试信号完成,包含 {len(self.data)} 个采样点")
  80.         print(f"信号幅值范围: {min(self.data)} 到 {max(self.data)}")
  81.         return self.data
  82.    
  83.     def perform_fft(self, sampling_rate=38400):
  84.         """
  85.         执行FFT变换
  86.         Perform FFT analysis
  87.         
  88.         Args:
  89.             sampling_rate: 采样率(Hz) / Sampling rate in Hz
  90.                         决定频率分析的范围和精度
  91.             
  92.         返回 | Returns:
  93.             dict: 包含FFT结果、幅值谱和频率点的字典
  94.         
  95.         FFT处理流程 | FFT Processing Flow:
  96.         1. 数据准备 -> 2. FFT计算 -> 3. 频谱计算 -> 4. 频率映射
  97.         """
  98.         try:
  99.             print(f"\n开始FFT分析,点数: {self.num_points}, 采样率: {sampling_rate}Hz")
  100.             
  101.             # 将列表转换为numpy数组,指定数据类型为16位无符号整数
  102.             # Convert list to numpy array with 16-bit unsigned integer type
  103.             # 模拟实际ADC采样的数据格式
  104.             data_array = np.array(self.data, dtype=np.uint16)
  105.             print("数据数组转换完成")
  106.             
  107.             # 创建FFT对象并执行变换
  108.             # Create FFT object and perform transform
  109.             # 参数说明:
  110.             # - data_array: 输入时域信号
  111.             # - self.num_points: FFT点数
  112.             # - 0x555: 配置参数(具体含义参考硬件手册)
  113.             fft_obj = FFT(data_array, self.num_points, 0x555)
  114.             print("FFT对象创建成功")
  115.             
  116.             # 获取FFT结果(复数形式,包含实部和虚部)
  117.             # Get FFT results (complex form, contains real and imaginary parts)
  118.             fft_result = fft_obj.run()
  119.             print("FFT计算完成")
  120.             
  121.             # 计算幅值谱 - 将复数结果转换为幅度值
  122.             # Calculate amplitude spectrum - convert complex results to magnitude values
  123.             # 幅值计算公式: magnitude = sqrt(real^2 + imag^2)
  124.             amplitude_spectrum = fft_obj.amplitude(fft_result)
  125.             print("幅值谱计算完成")
  126.             
  127.             # 计算频率点 - 将FFT结果索引映射到实际频率值
  128.             # Calculate frequency points - map FFT result indices to actual frequencies
  129.             # 频率分辨率 = 采样率 / FFT点数
  130.             frequency_points = fft_obj.freq(self.num_points, sampling_rate)
  131.             print("频率点计算完成")
  132.             
  133.             return {
  134.                 'fft_result': fft_result,        # 原始FFT复数结果
  135.                 'amplitude': amplitude_spectrum, # 幅值谱(用于分析信号强度)
  136.                 'frequencies': frequency_points  # 对应的频率值(Hz)
  137.             }
  138.             
  139.         except Exception as e:
  140.             print(f"FFT计算错误 / FFT calculation error: {e}")
  141.             print("可能的原因 | Possible reasons:")
  142.             print("  - 内存不足 | Insufficient memory")
  143.             print("  - 点数不是2的幂 | Points not power of 2")
  144.             print("  - 硬件FFT模块故障 | Hardware FFT module failure")
  145.             return None
  146. def main():
  147.     """
  148.     主函数 - 演示完整的FFT分析流程
  149.     Main function - demonstrates complete FFT analysis workflow
  150.     """
  151.     print("=== FFT频域分析演示程序 ===")
  152.     print("=== FFT Frequency Domain Analysis Demo ===")
  153.    
  154.     # 创建信号处理器实例,使用64点FFT
  155.     # Create signal processor instance with 64-point FFT
  156.     processor = SignalProcessor(64)
  157.    
  158.     # 生成测试信号(包含多个频率成分的复合信号)
  159.     # Generate test signal (composite signal with multiple frequency components)
  160.     print("\n1. 生成测试信号...")
  161.     signal = processor.generate_test_signal()
  162.     print("原始信号前10个点 / First 10 points of original signal:", signal[:10])
  163.    
  164.     # 执行FFT分析,使用38.4kHz采样率
  165.     # Perform FFT analysis with 38.4kHz sampling rate
  166.     print("\n2. 执行FFT分析...")
  167.     results = processor.perform_fft(sampling_rate=38400)
  168.    
  169.     if results:
  170.         print("\n3. FFT分析结果:")
  171.         print("   ====================")
  172.         
  173.         # 显示FFT原始结果(复数)
  174.         print("\n   FFT原始结果 (前5个点):")
  175.         for i in range(min(5, len(results['fft_result']))):
  176.             print(f"     点{i}: {results['fft_result'][i]}")
  177.         
  178.         # 显示幅值谱(最重要的分析结果)
  179.         print(f"\n   幅值谱 (所有{len(results['amplitude'])}个点):")
  180.         print("   ", results['amplitude'])
  181.         
  182.         # 显示频率点映射
  183.         print(f"\n   频率点映射 (Hz):")
  184.         print("   ", results['frequencies'])
  185.         
  186.         # 分析主要频率成分
  187.         print("\n4. 主要频率成分分析:")
  188.         print("   ====================")
  189.         amplitudes = results['amplitude']
  190.         frequencies = results['frequencies']
  191.         
  192.         # 找出幅值最大的几个频率成分(忽略直流分量)
  193.         significant_indices = sorted(range(1, len(amplitudes)),
  194.                                    key=lambda i: amplitudes[i],
  195.                                    reverse=True)[:5]
  196.         
  197.         for idx in significant_indices:
  198.             if amplitudes[idx] > 0.1:  # 只显示显著的频率成分
  199.                 print(f"   频率: {frequencies[idx]:.1f}Hz, 幅值: {amplitudes[idx]:.2f}")
  200.    
  201.     else:
  202.         print("\nFFT分析失败,请检查硬件和参数设置")
  203. if __name__ == "__main__":
  204.     main()
  205. """
  206. === FFT技术详解 ===
  207. 1. 频率分辨率:
  208.    频率分辨率 = 采样率 / FFT点数
  209.    本例中:38400Hz / 64点 = 600Hz
  210.    即每个频率点代表600Hz的频率范围
  211. 2. 奈奎斯特频率:
  212.    最高可分析频率 = 采样率 / 2 = 19200Hz
  213.    FFT结果的后半部分是前半部分的镜像
  214. 3. 幅值谱解释:
  215.    - 索引0: 直流分量(信号的平均值)
  216.    - 索引1~N/2-1: 正频率成分
  217.    - 索引N/2~N-1: 负频率成分(通常忽略)
  218. 4. 实际应用场景:
  219.    - 音频频谱分析
  220.    - 振动故障诊断
  221.    - 电源质量分析
  222.    - 通信信号处理
  223. === 预期分析结果 ===
  224. 在幅值谱中应该能明显看到5个峰值,对应生成的5个测试频率成分,
  225. 且幅值大小应与生成信号时的设置成比例。
  226. """
复制代码

代码解读:
FFT点数选择:必须是2的幂次,平衡分辨率与计算量
采样率设定:根据信号最高频率成分,满足奈奎斯特采样定理
频率分辨率:Δf = 采样率 / FFT点数,决定区分相近频率的能力
幅值谱分析:识别信号中的主要频率成分及其强度
硬件优势:K230的硬件FFT大幅提升计算效率,适合实时处理

这个示例展示了从信号生成到频域分析的完整流程,是数字信号处理的基础应用。


实验串口返回情况

【花雕动手做】CanMV K230 AI视觉模块之使用傅里叶变换图1

回复

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail