You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Arduino声音可视化项目中ArduinoFFT库编译错误求助

声音可视化器编译错误解决

问题概述

使用Arduino Nano、驻极体电容麦克风和8X32矩阵制作声音可视化器,编译时持续出现相同错误。

原代码

#include <ArduinoFFT.h>
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>

#define PIN_MATRIX 2 // Arduino Nano Pin D2 to DIN of matrix
#define PIN_MIC 0   // Arduino Nano Analog Pin A0 to microphone Vout
#define MATRIX_WIDTH 32
#define MATRIX_HEIGHT 8
#define MIC_SAMPLE_SIZE 48 // Change according to your mic module's specifications

ArduinoFFT fft;

Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(MATRIX_WIDTH, MATRIX_HEIGHT, PIN_MATRIX,
  NEO_MATRIX_TOP     + NEO_MATRIX_LEFT +
  NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG,
  NEO_GRB            + NEO_KHZ800);

void setup() {
  Serial.begin(9600);
  matrix.begin();
  matrix.setTextWrap(false);
  matrix.setBrightness(50); // Adjust brightness as needed
  matrix.setTextColor(matrix.Color(255, 255, 255)); // Text color
  fft.begin(MIC_SAMPLE_SIZE); // Initialize the FFT object
}

void loop() {
  fft.Execute(); // Run FFT

  int max_index = 0;
  int max_value = 0;

  for (int i = 0; i < MIC_SAMPLE_SIZE / 2; i++) {
    int value = fft.Output[i]; // Read FFT result
    if (value > max_value) {
      max_value = value;
      max_index = i;
    }
  }

  // Map max_index to matrix columns
  int column = map(max_index, 0, MIC_SAMPLE_SIZE / 2, 0, MATRIX_WIDTH);

  // Clear matrix
  matrix.fillScreen(0);

  // Draw bar on matrix
  for (int y = 0; y < MATRIX_HEIGHT; y++) {
    matrix.drawPixel(column, y, matrix.Color(255, 255, 255)); // White color
  }

  matrix.show();
}

编译错误信息

/Users/vyomesh/Documents/Arduino/sketch_apr22a/sketch_apr22a.ino:12:1: error: invalid use of template-name 'ArduinoFFT' without an argument list
 ArduinoFFT fft;
 ^~~~~~~~~~
/Users/vyomesh/Documents/Arduino/sketch_apr22a/sketch_apr22a.ino:12:1: note: class template argument deduction is only available with -std=c++1z or -std=gnu++1z
In file included from /Users/vyomesh/Documents/Arduino/sketch_apr22a/sketch_apr22a.ino:1:0:
/Users/vyomesh/Documents/Arduino/libraries/arduinoFFT/src/ArduinoFFT.h:58:29: note: 'template<class T> class ArduinoFFT' declared here
 template <typename T> class ArduinoFFT {
                             ^~~~~~~~~~
/Users/vyomesh/Documents/Arduino/sketch_apr22a/sketch_apr22a.ino: In function 'void setup()':
/Users/vyomesh/Documents/Arduino/sketch_apr22a/sketch_apr22a.ino:25:3: error: 'fft' was not declared in this scope
   fft.begin(MIC_SAMPLE_SIZE); // Initialize the FFT object
   ^~~
/Users/vyomesh/Documents/Arduino/sketch_apr22a/sketch_apr22a.ino:25:3: note: suggested alternative: 'ffs'
   fft.begin(MIC_SAMPLE_SIZE); // Initialize the FFT object
   ^~~
   ffs
/Users/vyomesh/Documents/Arduino/sketch_apr22a/sketch_apr22a.ino: In function 'void loop()':
/Users/vyomesh/Documents/Arduino/sketch_apr22a/sketch_apr22a.ino:29:3: error: 'fft' was not declared in this scope
   fft.Execute(); // Run FFT
   ^~~
/Users/vyomesh/Documents/Arduino/sketch_apr22a/sketch_apr22a.ino:29:3: note: suggested alternative: 'ffs'
   fft.Execute(); // Run FFT
   ^~~
   ffs

exit status 1

Compilation error: invalid use of template-name 'ArduinoFFT' without an argument list

硬件接线

8X32矩阵

  • GND 接 Arduino GND
  • 5V 接 Arduino 5V
  • DIN 接 Arduino D2

驻极体电容麦克风

  • 正极 接 Arduino A0,同时通过电阻连接5V
  • 负极 接 Arduino GND

环境信息

  • 系统:MacOS Sonoma
  • 使用库:ArduinoFFT.h

已尝试的解决方法

  • 重启Arduino IDE
  • 重装ArduinoFFT库
  • 尝试不同版本的ArduinoFFT库
  • 咨询AI工具未解决

错误原因及解决方案

错误核心

ArduinoFFT是模板类,声明对象时必须指定模板参数(数据类型),原代码中ArduinoFFT fft;缺少模板参数,导致编译报错。同时原代码还缺少FFT计算必需的采样数组、输出数组,以及正确的采样读取逻辑。

修复步骤

  1. 为ArduinoFFT对象指定模板参数(常用float类型)
  2. 定义FFT计算所需的实部、虚部数组
  3. 调整FFT初始化逻辑,补充窗口函数配置
  4. 添加麦克风采样读取步骤,再执行FFT计算
  5. 修正FFT结果的读取方式

修正后的完整代码

#include <ArduinoFFT.h>
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>

#define PIN_MATRIX 2 // Arduino Nano Pin D2 to DIN of matrix
#define PIN_MIC 0   // Arduino Nano Analog Pin A0 to microphone Vout
#define MATRIX_WIDTH 32
#define MATRIX_HEIGHT 8
#define MIC_SAMPLE_SIZE 64 // 使用2的幂次,FFT计算更高效
#define SAMPLING_FREQ 10000 // 采样频率,需满足奈奎斯特定理

// FFT计算所需数组
float vReal[MIC_SAMPLE_SIZE];
float vImag[MIC_SAMPLE_SIZE];

// 声明带模板参数的FFT对象
ArduinoFFT<float> fft(vReal, vImag, MIC_SAMPLE_SIZE, SAMPLING_FREQ);

Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(MATRIX_WIDTH, MATRIX_HEIGHT, PIN_MATRIX,
  NEO_MATRIX_TOP     + NEO_MATRIX_LEFT +
  NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG,
  NEO_GRB            + NEO_KHZ800);

void setup() {
  Serial.begin(9600);
  matrix.begin();
  matrix.setTextWrap(false);
  matrix.setBrightness(50);
  matrix.fillScreen(0);
  matrix.show();
  
  // 配置FFT窗口函数,减少频谱泄漏
  fft.windowing(FFT_WIN_TYP_HAMMING, FFT_FORWARD);
}

void loop() {
  // 读取麦克风采样数据,减去直流偏置(模拟输入中心值512)
  for(int i = 0; i < MIC_SAMPLE_SIZE; i++){
    vReal[i] = analogRead(PIN_MIC) - 512;
    vImag[i] = 0; // 虚部初始化为0
  }
  
  // 执行FFT计算
  fft.compute(FFT_FORWARD);
  // 将复数结果转换为幅值
  fft.complexToMagnitude();
  
  int max_index = 1; // 跳过直流分量(索引0)
  float max_value = 0;

  // 遍历FFT结果(仅前半部分,后半部分对称)
  for (int i = 1; i < MIC_SAMPLE_SIZE / 2; i++) {
    if (vReal[i] > max_value) {
      max_value = vReal[i];
      max_index = i;
    }
  }

  // 将频率索引映射到矩阵列
  int column = map(max_index, 1, MIC_SAMPLE_SIZE / 2, 0, MATRIX_WIDTH - 1);

  // 根据幅值计算条形高度
  int bar_height = map(max_value, 0, 1000, 0, MATRIX_HEIGHT);

  // 清除矩阵并绘制条形
  matrix.fillScreen(0);
  for (int y = MATRIX_HEIGHT - bar_height; y < MATRIX_HEIGHT; y++) {
    matrix.drawPixel(column, y, matrix.Color(255, 255, 255));
  }

  matrix.show();
  delay(10); // 控制可视化刷新速率
}

额外说明

  • 采样大小建议使用2的幂次(如64、128),这是FFT算法的最优输入规模,计算效率更高
  • 采样频率设置为10000Hz,可根据实际需求调整,但需确保大于两倍的目标最高频率(奈奎斯特采样定理)
  • 读取麦克风数据时减去512,是为了将静态输出偏置到0点,让正负音频波动更适合FFT计算

内容的提问来源于stack exchange,提问作者Vyomesh Vasanth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 13:29:56