fft_led/main.c
2024-02-28 22:52:37 +01:00

126 lines
2.6 KiB
C

#define F_CPU 16000000UL
#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"
#define STARTADC ADCSRA |= (1<<ADSC)
#define PB_mic PB0
//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
int main (void)
{
int i,i2;
int colorb;
int colora;
int avg;
char sample[128];
char im[128];
struct cRGB led_bar1[8];
//DDRB = (1<<mic);//would be setting output, default is input so no need for setting
setupADC();
for(i=0;i<8;i++)
{
led_bar1[i].r=0;
led_bar1[i].g=0;
led_bar1[i].b=0;
}
while(1)
{
//######RECORD SAMPLES#######
for(i=0;i<128;i++)
{
STARTADC;
sample[i] = (ADCH-128)*2; //read Analog value register 8bit center -128
im[i]=0; //pseudo data for funciton
}
fix_fft(sample,im,7,0);//im[i] is always zero
//####Averaging Data####
//
for(i2=0;i2<128;i2++)
{
sample[i2] = sqrt(sample[i2] * sample[i2] + im[i2]* im[i2]);
}
for(i=0;i<8;i++)
{
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++)
{
led_bar1[i].r=10;led_bar1[i].g=colorb;led_bar1[i].b=0;
ws2812_sendarray((uint8_t *)led_bar1,8*3);
_delay_ms(1);
}
for(colorb=256;colorb>0;colorb--)
{
led_bar1[i].r=0;led_bar1[i].g=colorb;led_bar1[i].b=10;
ws2812_sendarray((uint8_t *)led_bar1,8*3);
_delay_ms(1);
}*/
/*led_bar1[0].r=0;led_bar1[0].g=100;led_bar1[0].b=10;
ws2812_sendarray((uint8_t *)led_bar1,8*3);
_delay_ms(50);
led_bar1[0].r=255;led_bar1[0].g=0;led_bar1[0].b=10;
ws2812_sendarray((uint8_t *)led_bar1,8*3); */
// }
return 0;
}
int map(int value, int old_min, int old_max,int new_min, int new_max)
{
return (new_max/old_max*value);
}