ESP8266 14段音乐音频频谱代码
时间: 2023-07-09 19:28:02 浏览: 188
下面是一个使用ESP8266和WS2812 LED灯条来进行音频频谱分析的代码示例。此代码将读取MIC音频输入,并生成14个频段的音频频谱,并将其转换为LED灯的颜色。
```c++
#include <FastLED.h>
#include <ArduinoFFT.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
// 灯条配置
#define NUM_LEDS 280
#define DATA_PIN D4
CRGB leds[NUM_LEDS];
// FFT配置
#define SAMPLES 1024 // 必须是2的幂
#define SAMPLING_FREQUENCY 10000 // 采样频率
double vReal[SAMPLES];
double vImag[SAMPLES];
ArduinoFFT FFT = ArduinoFFT();
// WiFi配置
const char *ssid = "your_SSID";
const char *password = "your_PASSWORD";
WiFiUDP udp;
// 频段配置
const int n_bands = 14;
const int freq_bands[n_bands + 1] = {0, 150, 300, 450, 600, 750, 900, 1050, 1200, 1350, 1500, 1650, 1800, 1950, 10000};
void setup()
{
// 初始化串口和灯条
Serial.begin(115200);
FastLED.addLeds<WS2812, DATA_PIN, GRB>(leds, NUM_LEDS);
// 连接WiFi
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(1000);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
// 初始化UDP
udp.begin(1234);
}
void loop()
{
// 读取音频数据
uint16_t sample;
for (int i = 0; i < SAMPLES; i++)
{
if (udp.parsePacket() > 0)
{
sample = udp.read();
vReal[i] = (double)(sample - 32767) / 32767.0;
vImag[i] = 0;
}
else
i--;
}
// 进行FFT变换
FFT.Windowing(vReal, SAMPLES, FFT_WIN_TYP_HAMMING, FFT_FORWARD);
FFT.Compute(vReal, vImag, SAMPLES, FFT_FORWARD);
FFT.ComplexToMagnitude(vReal, vImag, SAMPLES);
double maxValue = 0;
for (int i = 2; i < (SAMPLES / 2); i++)
{
if (vReal[i] > maxValue)
maxValue = vReal[i];
}
// 将频谱分成14个频段,并计算平均值
int bin_bands[n_bands];
int bin_size = (SAMPLES / 2) / n_bands;
int bin_index = 0;
for (int i = 0; i < n_bands; i++)
{
bin_bands[i] = bin_index;
for (int j = 0; j < bin_size; j++)
{
bin_index++;
}
}
double band_values[n_bands];
for (int i = 0; i < n_bands; i++)
{
double sum = 0;
for (int j = bin_bands[i]; j < bin_bands[i + 1]; j++)
{
sum += vReal[j];
}
band_values[i] = sum / bin_size;
}
// 将频段值转换为灯条颜色
for (int i = 0; i < n_bands; i++)
{
int band_color = map(band_values[i], 0, maxValue, 0, 255);
for (int j = freq_bands[i]; j < freq_bands[i + 1]; j++)
{
leds[j] = CHSV(band_color, 255, 255);
}
}
// 输出调试信息
Serial.print("Max Value: ");
Serial.print(maxValue);
Serial.print(", Band Values: ");
for (int i = 0; i < n_bands; i++)
{
Serial.print(band_values[i]);
Serial.print(", ");
}
Serial.println();
// 更新灯条
FastLED.show();
}
```
请注意,该代码使用了以下库:
- FastLED
- ArduinoFFT
- ESP8266WiFi
- WiFiUdp
您需要将“your_SSID”和“your_PASSWORD”替换为您自己的WiFi SSID和密码。此代码将生成一个14个频段的音频频谱,并将其转换为LED灯的颜色。它从UDP接收音频数据,并使用FFT算法将其转换为频谱。然后将频谱分成14个频段,并计算每个频段的平均值。最后,将频段值映射到灯条颜色,并将其显示在LED上。
阅读全文