驴友花雕 发表于 2025-6-21 19:34:07

【Arduino 动手做】DIY 傅里叶 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。

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

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









驴友花雕 发表于 2025-6-21 19:36:03

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

项目代码

#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;
char data;
int barht;

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 = (char)(val/4 - 128); // store as char
    im = 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 = (int)sqrt(data * data + im * im);
}

for(i = 0, j = 0; i < SAMPLES/2; i++, j += 2)
{
    barht = barht + barht;
}

// 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, w, bh + 1); // u8glib doesn't accept box height of 0
    }
      
}while(lcd.nextPage());
}


驴友花雕 发表于 2025-6-21 19:42:31

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

【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





页: [1]
查看完整版本: 【Arduino 动手做】DIY 傅里叶 FFT 音频频谱分析仪