15浏览
查看: 15|回复: 2

[项目] 【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。

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

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

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

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

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

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

驴友花雕  中级技神
 楼主|

发表于 3 小时前

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

项目代码

  1. #include "U8glib.h"
  2. #include "fix_fft.h"
  3. // LCD SPI SCK-EN, MOSI-RW & SS-CS
  4. #define EN 6
  5. #define RW 5
  6. #define CS 4
  7. // display set up, bar, line position L & R
  8. #define LINEY 50
  9. #define LINEXL 0
  10. #define LINEXR 128
  11. #define SAMPLES 128
  12. #define AUDIO A0
  13. U8GLIB_ST7920_128X64_1X lcd(EN, RW, CS); // serial use, PSB = GND
  14. char im[SAMPLES];
  15. char data[SAMPLES];
  16. int barht[SAMPLES];
  17. void setup()
  18. {
  19.   lcd.begin(); // inti display
  20.   
  21. }
  22. void loop()
  23. {
  24.   static int i, j;
  25.   int val;
  26.   
  27.   // get audio data
  28.   for(i = 0; i < SAMPLES; i++)
  29.   {
  30.     val = analogRead(AUDIO); // 0-1023
  31.     data[i] = (char)(val/4 - 128); // store as char
  32.     im[i] = 0; // init all as 0
  33.   }
  34.   // run FFT
  35.   fix_fft(data, im, 7, 0);
  36.   // extract absolute value of data only, for 64 results
  37.   for(i = 0; i < SAMPLES/2; i++)
  38.   {
  39.     barht[i] = (int)sqrt(data[i] * data[i] + im[i] * im[i]);
  40.   }
  41.   
  42.   for(i = 0, j = 0; i < SAMPLES/2; i++, j += 2)
  43.   {
  44.     barht[i] = barht[j] + barht[j + 1];
  45.   }
  46.   
  47.   // display barchart
  48.   barchart(SAMPLES/4, barht); // plot SAMPLES / 4 = 32 as barchart gen cannot handle 128 bars
  49. }
  50. // plot line and bar at position and height
  51. void barchart(int n, int bh[])
  52. {
  53.   int i, s, w; // bars, spacing and width
  54.   
  55.   s = (LINEXR - LINEXL) / n;
  56.   w = s / 2;
  57.   
  58.   lcd.firstPage();
  59.   do
  60.   {
  61.     lcd.setFont(u8g_font_helvR08);
  62.     lcd.drawStr(20, 10, "FFT Audio Spectrum");
  63.     lcd.drawLine(LINEXL, LINEY, LINEXR, LINEY);
  64.     lcd.drawStr(0, LINEY + 10, "0");
  65.     lcd.drawStr(29, LINEY + 10, "1k");
  66.     lcd.drawStr(59, LINEY + 10, "2k");
  67.     lcd.drawStr(91, LINEY + 10, "3k");
  68.     lcd.drawStr(115, LINEY + 10, "Hz");
  69.    
  70.     for(i = 0; i < n; i++)
  71.     {
  72.       lcd.drawBox(LINEXL + s * i, LINEY - bh[i], w, bh[i] + 1); // u8glib doesn't accept box height of 0
  73.     }
  74.       
  75.   }while(lcd.nextPage());
  76. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 3 小时前

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

【Arduino 动手做】DIY 傅里叶 FFT 音频频谱分析仪
项目链接:https://www.hackster.io/mircemk/ ... rum-analyzer-ca2926
项目作者:北马其顿 米尔塞姆克(Mirko Pavleski)

项目视频 :https://www.youtube.com/watch?v=QD6DWnwmyCY
项目代码:https://www.hackster.io/code_files/455471/download

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

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

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail