Arduin0 发表于 2014-12-11 22:08:38

用Arduino显示音乐频谱

硬件组成:Arduino UNO板,8x8的LED显示模块,麦克风模块

软件:
用到了开源的FFT库(数据采集与转换的代码基本就是他们的示例代码了),LedControl库用于驱动LED屏
自己所做的就是把这些东西整合了起来

http://v.youku.com/v_show/id_XODQ2NDEzNTcy.html#define LOG_OUT 1
#define FFT_N 256
//#define DEBUG

#include <FFT.h>
#include <LedControl.h>

#define SIZE_WIDTH8
#define SIZE_HEIGHT 8
#define MAX_SPECTRUM 32
#define GAIN 2.3
#define FREQUENCY_INDEX(I) ((I) * 3 + 10)

#define SET_SPECTRUMS() \
        do { \
                for(int i = 0; i < SIZE_WIDTH; i++) { \
                        g_lc.setRow(0, i, g_spectrums); \
                } \
        }while(0)
       
#define GET_SPECTRUM(VAL) 0xff << ((8 - ((VAL) > MAX_SPECTRUM ? (VAL) : ((VAL) < 0 ? 0 : (VAL))) / 8))

LedControl g_lc = LedControl(7, 5, 6, 1);

uint8_t g_spectrums = { 0 };
uint8_t g_fft_init_log = { 0 };

bool g_first_flag = true;


void setup()
{
        #ifdef DEBUG
        Serial.begin(115200);
        #endif

        TIMSK0 = 0;   // turn off timer0 for lower jitter
        ADCSRA = 0xe5;// set the adc to free running mode
        ADMUX= 0x40;// use adc0
        DIDR0= 0x01;// turn off the digital input for adc0
       
        g_lc.shutdown(0, false);
        g_lc.setIntensity(0, 8);
        g_lc.clearDisplay(0);

}

void loop()
{
        while(1) {
                cli();
                for (int i = 0 ; i < 256 ; i += 2) {
                        while(!(ADCSRA & 0x10));
                        ADCSRA = 0xf5;
                        byte m = ADCL;
                        byte j = ADCH;
                        int k = (j << 8) | m;
                        k -= 0x0200;
                        k <<= 6;
                        fft_input = k;
                        fft_input = 0;
                }
                fft_window();
                fft_reorder();
                fft_run();
                fft_mag_log();
                sei();
                if(g_first_flag) {
                        g_first_flag = false;
                        memcpy(g_fft_init_log, fft_log_out, sizeof(g_fft_init_log));
                }
                else {
                        for(int i =0; i < sizeof(g_spectrums); i++) {
                                int j = FREQUENCY_INDEX(i);
                                int v = (int) (GAIN * (fft_log_out - g_fft_init_log));
                                g_spectrums = GET_SPECTRUM(v);
                        }
                        SET_SPECTRUMS();
                }
                #ifdef DEBUG
                Serial.write(255);
                Serial.write(fft_log_out, 128);
                #endif
        }
}



maxims 发表于 2014-12-11 22:41:30

赞一个~
把屏做大点就完美了。或者用VFD

zoologist 发表于 2014-12-12 07:48:56

做 fft 速度够么?

老胖熊 发表于 2014-12-12 09:31:40

好玩                           

mkk 发表于 2015-3-2 17:17:48

这个库文件貌似不是标准的fft库,有木有库文件提供一下吧

tianjiwen 发表于 2015-3-13 13:40:27

好,很好。非常好!就是看不到?

胤123 发表于 2017-4-13 18:56:08

楼主这个可不可以利用在驱动小电机上

通幽境 发表于 2017-4-16 17:11:53

能上RGB就更漂亮了
页: [1]
查看完整版本: 用Arduino显示音乐频谱