采用MAX7219四合一点阵模块显示100频率形成的频谱 的代码
时间: 2023-06-14 18:07:17 浏览: 171
c# 频谱显示的源代码
4星 · 用户满意度95%
这里提供一个基于Arduino和MAX7219四合一点阵模块的频谱显示代码,可以实现从麦克风输入的音频信号的频谱分析并在点阵模块上显示出来。代码如下:
``` c++
#include <MD_MAX72xx.h>
#include <MD_Parola.h>
#include <MD_Arduboy.h>
#include <FFT.h>
#define NUM_ROWS 8 // 点阵行数
#define NUM_COLS 32 // 点阵列数
#define DATA_PIN 11 // 数据引脚
#define CLK_PIN 13 // 时钟引脚
#define CS_PIN 10 // 片选引脚
MD_MAX72XX mx = MD_MAX72XX(DATA_PIN, CLK_PIN, CS_PIN, 4); // 初始化点阵模块
MD_Parola P = MD_Parola(DATA_PIN, CLK_PIN, CS_PIN, 4); // 初始化Parola库
#define SAMPLES 128 // 采样点数
#define LOG_SAMPLES 7 // 采样点数的对数
#define SAMPLE_RATE 8000 // 采样率
byte spectrum[NUM_COLS]; // 频谱数据
byte peak[NUM_COLS]; // 峰值数据
byte prev_spectrum[NUM_COLS]; // 上一帧的频谱数据
byte prev_peak[NUM_COLS]; // 上一帧的峰值数据
FFT fft = FFT(); // 初始化FFT库
void setup() {
mx.begin(); // 初始化点阵模块
P.begin(); // 初始化Parola库
P.setInvert(false); // 设置不反转显示
P.setIntensity(2); // 设置亮度
P.displayClear(); // 清空显示
}
void loop() {
// 读取音频信号并进行FFT分析
int signal[SAMPLES];
for (int i = 0; i < SAMPLES; i++) {
signal[i] = analogRead(A0) - 512; // 读取麦克风信号并去除直流分量
delayMicroseconds(1000000 / SAMPLE_RATE);
}
fft.Windowing(signal, SAMPLES, FFT_WIN_TYP_HAMMING, FFT_FORWARD);
fft.Compute(signal, SAMPLES, FFT_FORWARD);
fft.ComplexToMagnitude(signal, SAMPLES);
// 更新频谱数据
for (int i = 0; i < NUM_COLS; i++) {
int start = pow(2, i * LOG_SAMPLES / NUM_COLS);
int end = pow(2, (i + 1) * LOG_SAMPLES / NUM_COLS) - 1;
float sum = 0;
for (int j = start; j <= end; j++) {
sum += signal[j];
}
spectrum[NUM_COLS - 1 - i] = sum / (end - start + 1);
// 更新峰值数据
if (spectrum[NUM_COLS - 1 - i] > peak[NUM_COLS - 1 - i]) {
peak[NUM_COLS - 1 - i] = spectrum[NUM_COLS - 1 - i];
}
else if (peak[NUM_COLS - 1 - i] > 0) {
peak[NUM_COLS - 1 - i]--;
}
}
// 绘制频谱图
for (int i = 0; i < NUM_COLS; i++) {
for (int j = 0; j < NUM_ROWS; j++) {
if (spectrum[i] > (NUM_ROWS - j - 1) * 32) {
mx.setPoint(i, j, true);
}
else {
mx.setPoint(i, j, false);
}
}
}
// 绘制峰值图
for (int i = 0; i < NUM_COLS; i++) {
for (int j = 0; j < NUM_ROWS; j++) {
if (peak[i] > (NUM_ROWS - j - 1) * 32) {
if (prev_peak[i] > peak[i]) {
mx.setPoint(i, j, true);
}
}
else {
if (prev_spectrum[i] > spectrum[i]) {
mx.setPoint(i, j, false);
}
}
}
}
// 保存上一帧的数据
memcpy(prev_spectrum, spectrum, NUM_COLS);
memcpy(prev_peak, peak, NUM_COLS);
// 点阵模块显示
mx.flush();
// 清空显示
P.displayClear();
delay(1000);
}
```
代码中使用了FFT库对采样的音频信号进行频谱分析,并将分析结果显示在点阵模块上。具体实现过程如下:
1. 在`setup()`函数中初始化点阵模块和Parola库。
2. 在`loop()`函数中读取麦克风信号,并进行FFT分析,得到频谱数据。
3. 更新频谱数据,并根据频谱数据更新峰值数据。
4. 绘制频谱图和峰值图,并保存上一帧的数据。
5. 点阵模块显示。
6. 清空Parola库显示,等待1秒。
需要注意的是,这个代码只是一个简单的示例,可能存在一些问题,比如频谱数据的计算方法、峰值数据的更新策略等。如果需要更加精确和稳定的频谱分析结果,需要对代码进行优化和调整。
阅读全文