【Arduino 动手做】DIY 傅里叶 FFT 音频频谱分析仪

2025-06-211419
AI 快速预览详细 收起
本文介绍了如何使用Arduino Nano和128x64 LCD显示屏等简单组件制作傅里叶FFT音频频谱分析仪。通过具体案例,展示了正弦波、矩形波和音乐信号的频谱分析效果。这个项目适合零基础新手入门,可以作为教学工具,帮助理解频谱分析原理。
FFT频谱分析仪是利用傅里叶分析和数字信号处理技术提供频谱分析的测试设备。

FFT频谱分析仪是一种利用傅里叶分析和数字信号处理技术进行频谱分析的测试设备。例如,傅里叶分析可以将连续时域中的一个值转换为连续频域,其中包含幅度和相位信息。

所描述的设备正是借助Arduino微控制器实现的光谱分析仪。您可以看到该设备非常简单,仅包含几个组件:

-Arduino Nano

- 分辨率为 128 x 64 像素的 LCD 显示屏(ST7920 128x64 LCD)

- 两个电阻器(10KOhm)

- 电位器(10KOhm)和

- 电容器(1微法拉)

Arduino 的音频输入位于 A0 接口,中间点偏置为 10K 电阻接地,10K 电阻接地 +5V。输入端还可以设置一个电位器来控制输入信号的幅度。

代码也很简单,它使用为此目的创建的“fix_fft”库

视频中描述了几种分析不同类型信号的案例:

当分析正弦输入信号时,载波清晰可见,并且通过改变信号发生器的频率,载波的位置也会发生变化。

如果我们将矩形信号输入到频谱分析仪上,可以清楚地看到基波信号,以及三个奇数谐波 x3、x5 和 x7。

如果我们将音频音乐信号输入到该设备,它实际上是一个图形音频分析仪,可以在更昂贵的音频设备中找到

最后,将整个组件放入合适的盒子中。由于分辨率和频率范围较低,它并非专业工具,但可以作为一个很好的教学工具。

【Arduino 动手做】DIY 傅里叶 FFT 音频频谱分析仪图2

【Arduino 动手做】DIY 傅里叶 FFT 音频频谱分析仪图3

【Arduino 动手做】DIY 傅里叶 FFT 音频频谱分析仪图4

【Arduino 动手做】DIY 傅里叶 FFT 音频频谱分析仪图1

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(2)
驴友花雕
驴友花雕
作者
【Arduino 动手做】DIY 傅里叶 FFT 音频频谱分析仪
项目链接:https://www.hackster.io/mircemk/diy-fft-audio-spectrum-analyzer-ca2926
项目作者:北马其顿 米尔塞姆克(Mirko Pavleski)
项目视频 :https://www.youtube.com/watch?v=QD6DWnwmyCY
项目代码:https://www.hackster.io/code_files/455471/download


驴友花雕
驴友花雕
作者
项目代码
[code]#include "U8glib.h"
#include "fix_fft.h"
// LCD SPI SCK-EN, MOSI-RW & SS-CS
#define EN 6
#define RW 5
#define CS 4
// display set up, bar, line position L & R
#define LINEY 50
#define LINEXL 0
#define LINEXR 128
#define SAMPLES 128
#define AUDIO A0
U8GLIB_ST7920_128X64_1X lcd(EN, RW, CS); // serial use, PSB = GND
char im[SAMPLES];
char data[SAMPLES];
int barht[SAMPLES];
void setup()
{
lcd.begin(); // inti display
}
void loop()
{
static int i, j;
int val;
// get audio data
for(i = 0; i < SAMPLES; i++)
{
val = analogRead(AUDIO); // 0-1023
data[i] = (char)(val/4 - 128); // store as char
im[i] = 0; // init all as 0
}
// run FFT
fix_fft(data, im, 7, 0);
// extract absolute value of data only, for 64 results
for(i = 0; i < SAMPLES/2; i++)
{
barht[i] = (int)sqrt(data[i] * data[i] + im[i] * im[i]);
}
for(i = 0, j = 0; i < SAMPLES/2; i++, j += 2)
{
barht[i] = barht[j] + barht[j + 1];
}
// display barchart
barchart(SAMPLES/4, barht); // plot SAMPLES / 4 = 32 as barchart gen cannot handle 128 bars
}
// plot line and bar at position and height
void barchart(int n, int bh[])
{
int i, s, w; // bars, spacing and width
s = (LINEXR - LINEXL) / n;
w = s / 2;
lcd.firstPage();
do
{
lcd.setFont(u8g_font_helvR08);
lcd.drawStr(20, 10, "FFT Audio Spectrum");
lcd.drawLine(LINEXL, LINEY, LINEXR, LINEY);
lcd.drawStr(0, LINEY + 10, "0");
lcd.drawStr(29, LINEY + 10, "1k");
lcd.drawStr(59, LINEY + 10, "2k");
lcd.drawStr(91, LINEY + 10, "3k");
lcd.drawStr(115, LINEY + 10, "Hz");
for(i = 0; i < n; i++)
{
lcd.drawBox(LINEXL + s * i, LINEY - bh[i], w, bh[i] + 1); // u8glib doesn't accept box height of 0
}
}while(lcd.nextPage());
}
[/code]
- 没有更多了 -