偶然心血来潮,想要做一个声音可视化的系列专题。这个专题的难度有点高,涉及面也比较广泛,相关的FFT和FHT等算法也相当复杂,不过还是打算从最简单的开始,实际动手做做试验,耐心尝试一下各种方案,逐步积累些有用的音乐频谱可视化的资料,也会争取成型一些实用好玩的音乐可视器项目。
【花雕动手做】有趣好玩的音乐可视化系列小项目(06)—点阵频谱灯
项目所需材料如下:
【花雕动手做】音乐可视化系列小项目(06)—点阵频谱灯
项目之一:两位点阵屏八段分频音乐频谱仪
实验场景图
实验场景动态图
【花雕动手做】音乐可视化系列小项目(06)—点阵频谱灯
项目之两位点阵屏八段分频音乐频谱仪
实验视频剪辑
https://v.youku.com/v_show/id_XNTgxMjgzMTQ5Mg==.html?firsttime=0
【花雕动手做】音乐可视化系列小项目(06)—点阵频谱灯
项目之二:FFT算法,八段音乐可视化动态频谱仪
实验开源代码
/*
【花雕动手做】音乐可视化系列小项目(06)---点阵频谱灯
项目之二:FFT算法,八段音乐可视化动态频谱仪
*/
#include <arduinoFFT.h>
#include <MD_MAX72xx.h>
#include <SPI.h>
MD_MAX72XX disp = MD_MAX72XX(MD_MAX72XX::FC16_HW, 10, 4);
arduinoFFT FFT = arduinoFFT();
double realComponent[64];
double imagComponent[64];
int spectralHeight[] = {0b00000000,0b10000000,0b11000000,
0b11100000,0b11110000,0b11111000,
0b11111100,0b11111110,0b11111111};
int index, c, value;
void setup()
{
disp.begin();
Serial.begin(9600);
}
void loop()
{
int sensitivity = map(analogRead(A6),0,1023,50,100);
Serial.println (analogRead(A6));
for(int i=0; i<64; i++)
{
realComponent[i] = analogRead(A7)/sensitivity;
imagComponent[i] = 0;
}
FFT.Windowing(realComponent, 64, FFT_WIN_TYP_HAMMING, FFT_FORWARD);
FFT.Compute(realComponent, imagComponent, 64, FFT_FORWARD);
FFT.ComplexToMagnitude(realComponent, imagComponent, 64);
for(int i=0; i<32; i++)
{
realComponent[i] = constrain(realComponent[i],0,80);
realComponent[i] = map(realComponent[i],0,80,0,8);
index = realComponent[i];
value = spectralHeight[index];
c = 31 - i;
disp.setColumn(c, value);
}
}
【花雕动手做】音乐可视化系列小项目(06)—点阵频谱灯
项目之二:FFT算法,八段音乐可视化动态频谱仪
实验视频剪辑
https://v.youku.com/v_show/id_XNTgxMjkwMjA5Ng==.html?spm=a2hcb.playlsit.page.1
实验场景动态图
【花雕动手做】音乐可视化系列小项目(06)—点阵频谱灯
项目之十六段音乐可视化动态频谱仪(使用FFT算法)
实验视频剪辑
https://v.youku.com/v_show/id_XNTgxMjkxMjkxNg==.html?firsttime=0
实验场景动态图