Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <math.h>
- #include "kiss_fft.h"
- float hanningWindow(short in, size_t i, size_t s) {
- return in*0.5f*(1.0f-cos(2.0f*M_PI*(float)(i)/(float)(s-1.0f)));
- }
- void drawBar(kiss_fft_cpx *fin, int start, int range) {
- unsigned int i, barlen, barval;
- kiss_fft_cpx ffto;
- barlen = 0;
- for(i=0;i<range;i++) {
- ffto = fin[start + i];
- // sqrt(i*i + r*r)
- barval = sqrt(ffto.i * ffto.i + ffto.r * ffto.r);
- // 20 * log10(2^16) should max at 96(db), but i get values over 150?
- barval = (unsigned int)(20.0f * (float)log10(barval));
- // Record the maximum bin value over this range
- if(barval > barlen)
- barlen = barval;
- }
- // Generate bars 150 chars long, pad with spaces
- for(i=0;i<barlen;i++)
- printf("*");
- for(;i<150;i++)
- printf(" ");
- printf("\n");
- }
- int main() {
- kiss_fft_cpx *fin = malloc(sizeof(kiss_fft_cpx)*1024);
- kiss_fft_cpx *fout = malloc(sizeof(kiss_fft_cpx)*1024);
- unsigned int barlen, barval;
- int16_t buf[1024];
- int fd;
- int i;
- fd = open("/tmp/mpd.fifo", O_RDONLY); // 44100:16:1
- kiss_fft_cfg mycfg = kiss_fft_alloc(1024,0,NULL,NULL); // 1024 bins = 48kHz
- printf("\033[2J"); // Clear screen
- while(read(fd, buf, sizeof(buf)) > 0) { // Keep looping while we have samples
- for(i=0;i<1024;i++) { // Populate sample buffer
- fin[i].r = hanningWindow(buf[i],i,1024); // Apply Hanning Window
- fin[i].i = 0;
- }
- kiss_fft(mycfg, fin, fout); // Perform FFT
- printf("\033[H"); // Return cursor to 0,0
- // Ignore the first 5 bins (DC + <200Hz)
- for(i=5;i<=37;i++) { // Pull the next 32 bins into bars
- drawBar(fout, i, 1); // Draw bars of 1 bin width
- }
- for(i=3;i<24;i++) { // Generate 21 more bars from the remaining 336 bins
- drawBar(fout, i*16, 16); // Draw bars of 16 bin widths
- }
- }
- close(fd);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement