arduino显示频谱
时间: 2023-06-12 08:04:59 浏览: 80
基于FFT的arduino音乐频谱显示
4星 · 用户满意度95%
要在 Arduino 上显示频谱,您可以使用一个音频输入传感器(如电容式麦克风),将其连接到 Arduino 的 ADC 引脚上,以读取音频信号。然后,您可以使用 FFT(快速傅里叶变换)算法将音频信号转换为频谱数据,并在 OLED 显示屏或 LED 灯条上显示频谱。
以下是一个示例代码,使用 Adafruit NeoPixel LED 灯条来显示频谱:
```C++
#include <Adafruit_NeoPixel.h>
#include <avr/power.h>
#include <math.h>
#include <FFT.h>
#define MIC_PIN A0 // 麦克风输入引脚
#define LED_PIN 6 // LED 灯条的数据引脚
#define LED_COUNT 16 // 灯条中 LED 的数量
#define SAMPLE_RATE 2000 // 采样率
// 创建一个 NeoPixel 灯条对象
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
// 创建一个 FFT 对象
FFT fft;
void setup() {
pixels.begin(); // 初始化灯条
Serial.begin(115200); // 打开串口
}
void loop() {
// 读取麦克风输入信号
static double vReal[SAMPLE_RATE];
static double vImag[SAMPLE_RATE];
for (int i = 0; i < SAMPLE_RATE; i++) {
vReal[i] = analogRead(MIC_PIN);
vImag[i] = 0;
delayMicroseconds(1000000 / SAMPLE_RATE);
}
// 运行 FFT 算法
fft.Windowing(vReal, SAMPLE_RATE, FFT_WIN_TYP_HAMMING); // 对采样数据进行加窗处理
fft.Compute(vReal, vImag, SAMPLE_RATE, FFT_FORWARD); // 进行 FFT 变换
// 显示频谱数据
for (int i = 0; i < LED_COUNT; i++) {
int j = pow(2, i) - 1;
int x = map(j, 0, LED_COUNT - 1, 0, SAMPLE_RATE / 2);
int y = sqrt(vReal[x] * vReal[x] + vImag[x] * vImag[x]) / 10; // 计算振幅
pixels.setPixelColor(i, pixels.Color(0, y, 0)); // 设置 LED 颜色
}
pixels.show(); // 显示 LED
}
```
这段代码使用了 FFT 库,可以从 Arduino 库管理器中下载。在代码中,我们首先读取麦克风输入信号,并进行 FFT 变换,得到频谱数据。然后,我们根据频谱数据设置 LED 的颜色,以显示频谱。此外,我们还需要在 setup() 函数中初始化灯条对象,并打开串口以进行调试。
阅读全文