打印
[PIC®/AVR®/dsPIC®产品]

遇到一些ArduinoFFT库函数的问题

[复制链接]
443|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我准备用Arduino做个FFT音乐频谱显示。
看了ArduinoFFT的库
比如我用128的采样点
那么
  // 执行FFT变换
  FFT.Windowing(vReal, SAMPLES, FFT_WIN_TYP_HAMMING, FFT_FORWARD);
  FFT.Compute(vReal, vImag, SAMPLES, FFT_FORWARD);
  FFT.ComplexToMagnitude(vReal, vImag, SAMPLES);

之后得到了128个vReal值。

vReal[0],vReal[1],vReal[2],vReal[3],vReal[4],.....vReal[63],vReal[64],vReal[65],...vReal[126],vReal[127]
观察发现,并非vReal[0]==vReal[127]
而是
vReal[1]==vReal[127]
vReal[2]==vReal[126]



vReal[63]==vReal[65]
中间点是vReal[64]
其中呢
vReal[0],vReal[1],很离谱,特别是vReal[0]大的离谱,没在库函数的说明里看到介绍,看到有网友是舍弃vReal[0],vReal[1]
只取
vReal[2]~vReal[64]

有没有明白的出来说说看。

使用特权

评论回复
沙发
gaoyang9992006|  楼主 | 2023-5-16 17:30 | 只看该作者
于是我把这个问题丢个GPT

vReal[0]和vReal[1]的结果在FFT频谱中通常会显示较大的值,这是由FFT算法的性质所决定的。

在FFT变换中,vReal[0]表示直流分量(DC component),即信号的平均值或直流偏移量。vReal[1]表示基频(fundamental frequency)分量,即信号的最低频率成分。

通常情况下,vReal[0]和vReal[1]的值较大是正常的,尤其在音频信号处理中。它们所代表的是频谱中的直流分量和基频成分。

如果您的应用中不需要考虑这些直流分量和基频成分,可以将它们从频谱图中去除或忽略,仅关注其他频率成分的显示。您可以通过修改绘制频谱的循环来实现:

// 绘制频谱
int barWidth = 1;
for (int i = 2; i < (SAMPLES / 2); i++) {
  int barHeight = map(vReal[i], 0, 512, 0, 32);   // 调整频谱高度范围
  display.fillRect((i - 2) * barWidth, 32 - barHeight, barWidth, barHeight, SSD1306_WHITE);

  // 计算频率值
  double frequency = (i - 2) * frequencySpacing;
  display.setCursor((i - 2) * barWidth, 32 - barHeight - 8);
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.print(int(frequency));
  display.print("Hz");
}
通过将绘制频谱的循环起始值从2开始,跳过直流分量和基频分量,您可以在频谱图中排除它们并显示其他频率成分的结果。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:西安公路研究院南京院
简介:主要工作从事监控网络与通信网络设计,以及从事基于嵌入式的通信与控制设备研发。擅长单片机嵌入式系统物联网设备开发,音频功放电路开发。

1966

主题

15954

帖子

208

粉丝