fft_led/main.c

126 lines
2.6 KiB
C
Raw Normal View History

2024-02-27 20:29:54 +00:00
#define F_CPU 16000000UL
2024-02-27 12:12:18 +00:00
#include<util/delay.h>
#include<avr/io.h>
#include"fix_fft.h"
#include"avr_adc.h"
#include"light_ws2812_AVR/Light_WS2812/ws2812_config.h"
#include"light_ws2812_AVR/Light_WS2812/light_ws2812.h"
2024-02-28 21:52:37 +00:00
#define STARTADC ADCSRA |= (1<<ADSC)
2024-02-27 12:12:18 +00:00
#define PB_mic PB0
2024-02-28 21:52:37 +00:00
//resolution fft calc:
//https://3roam.com/fft-resolution-bandwidth-calculator/
//128 samples , 1kSPS = 7.8Hz
//interested in 0-10000 Hz
//
//128 bins a 7.8hz = 0...1000Hz
//
//we have 8 leds:
//bands 125hz/band -> 16 bins
//
//1-7.8 - ca 130hz
//2- 255hz
//3- 380
//4- 505
//5- 630
//6- 755
//7- 880
//8- 1kHz
2024-02-27 12:12:18 +00:00
int main (void)
{
2024-02-28 21:52:37 +00:00
int i,i2;
2024-02-27 20:59:27 +00:00
int colorb;
2024-02-28 21:52:37 +00:00
int colora;
int avg;
2024-02-27 12:12:18 +00:00
char sample[128];
char im[128];
2024-02-27 20:29:54 +00:00
struct cRGB led_bar1[8];
//DDRB = (1<<mic);//would be setting output, default is input so no need for setting
2024-02-27 20:59:27 +00:00
setupADC();
2024-02-27 20:29:54 +00:00
for(i=0;i<8;i++)
{
2024-02-27 20:59:27 +00:00
led_bar1[i].r=0;
led_bar1[i].g=0;
led_bar1[i].b=0;
2024-02-27 20:29:54 +00:00
}
2024-02-27 12:12:18 +00:00
2024-02-28 21:52:37 +00:00
2024-02-27 12:12:18 +00:00
while(1)
{
//######RECORD SAMPLES#######
2024-02-27 20:59:27 +00:00
for(i=0;i<128;i++)
2024-02-28 21:52:37 +00:00
{
STARTADC;
sample[i] = (ADCH-128)*2; //read Analog value register 8bit center -128
2024-02-27 12:12:18 +00:00
im[i]=0; //pseudo data for funciton
2024-02-27 20:59:27 +00:00
}
fix_fft(sample,im,7,0);//im[i] is always zero
2024-02-28 21:52:37 +00:00
//####Averaging Data####
//
for(i2=0;i2<128;i2++)
{
sample[i2] = sqrt(sample[i2] * sample[i2] + im[i2]* im[i2]);
}
2024-02-27 20:59:27 +00:00
for(i=0;i<8;i++)
{
2024-02-28 21:52:37 +00:00
for(i2=1;i2<=16;i2++)
{
sample[i] = (sample[i] + sample[i*16+i2])/2;
}
//avg written to sample[0..7]
//contains values scaled to int boundarys
//scale them to 0..256
sample[i]= map(sample[i],0,30,0,255);
led_bar1[i].r=0;;led_bar1[i].b=0;
//if(sample[i]<2) sample[i]=2;
led_bar1[i].g=sample[i];
}
ws2812_setleds((uint8_t *)led_bar1,8);
}
// _delay_ms(50);
// for(i=0;i<8;i++)
// {
/* for(colorb=0;colorb<256;colorb++)
2024-02-27 20:59:27 +00:00
{
led_bar1[i].r=10;led_bar1[i].g=colorb;led_bar1[i].b=0;
2024-02-27 20:29:54 +00:00
ws2812_sendarray((uint8_t *)led_bar1,8*3);
2024-02-27 20:59:27 +00:00
_delay_ms(1);
2024-02-27 12:12:18 +00:00
2024-02-27 20:59:27 +00:00
}
for(colorb=256;colorb>0;colorb--)
{
2024-02-27 21:02:43 +00:00
led_bar1[i].r=0;led_bar1[i].g=colorb;led_bar1[i].b=10;
2024-02-27 20:59:27 +00:00
ws2812_sendarray((uint8_t *)led_bar1,8*3);
_delay_ms(1);
2024-02-28 21:52:37 +00:00
}*/
/*led_bar1[0].r=0;led_bar1[0].g=100;led_bar1[0].b=10;
2024-02-27 20:59:27 +00:00
ws2812_sendarray((uint8_t *)led_bar1,8*3);
2024-02-28 21:52:37 +00:00
_delay_ms(50);
2024-02-27 20:59:27 +00:00
led_bar1[0].r=255;led_bar1[0].g=0;led_bar1[0].b=10;
2024-02-28 21:52:37 +00:00
ws2812_sendarray((uint8_t *)led_bar1,8*3); */
// }
2024-02-27 20:59:27 +00:00
2024-02-27 12:12:18 +00:00
return 0;
}
2024-02-28 21:52:37 +00:00
int map(int value, int old_min, int old_max,int new_min, int new_max)
{
return (new_max/old_max*value);
}