FFT dönüşümü hakkında

Başlatan Mucit23, 31 Ocak 2014, 00:08:32

Mucit23

Anladığım kadarıyla daha yemem gereken 2 fırın ekmek var.
Son haliyle böyle
Stm32f407 FFT Test
ADC örnekleme işin oturttum rayına. Bargraph işinide şimdilik geçtim, Ona sonra bakacam. Benim FFT rutinlerimde problem var. İlk önce bu kısmı problemsiz bir şekilde çalıştırmam gerek.

ADC örnekleme frekansım 22Khz dolayısıyla 11Khz ye kadar ölçebilmem lazım. Videoda 100Hz ile 11Khz çıkıp tekrar 100hz iniyorum. Bilgisayarın direk kulaklık jakından sinyal aldığım için hoperlorlerden ses gelmiyor.

Videoda göreceğiniz üzere sadece ilk 16 band çalışıyor. FFT rutinlerine pek karışmadım. Buradaki uygulamadaki kodları kullanıyorum.
http://www.waitingforfriday.com/index.php/Real-Time_Audio_Spectrum_Analyser

Bu konu üzerinde araştırma yapıyorum. Benim asıl problemim FFT sonucunun çok hareketli olması. Videoda çok net anlaşılıyor.
Şuanda bütün örnek alma FFT ve Bargraph rutinleri toplamda 5.5ms den az sürüyor. Yani FPS değeri 180 civarında. Çok yüksek bir değer. Bunu delay koyarak yavaşlatabilirim ama FFT sonucunun değişken olmasına çözüm olmaz. Bunu çözemiyorum bir türlü.

Fikri olan varmı Neden böyle olabilir? 

Mucit23

Arkadaşlar 2. Problem hakkında fikri olan varmı?  Örneğin 1khz sabit frekans uygulasam ve bu frekansı temsil eden bandın değeri neden sürekli olarak değişir.

Birde FPS konusu var.

sadogan

Verdiğiniz linkteki spekturm un *.hex dosyası varmı bende c18 olmadığından derleyemedim.
İsis te simüle etmek istiyorum.

Mucit23


superconductor

Hocam bucked degerlerini direk barlara gondermek yerine birkac ornegin ortalamasini alarak gonder cozulur. Barlar duserken yavas dussun diyede birseyler yapabilirsin.

z

Alıntı yapılan: Mucit23 - 18 Şubat 2014, 08:42:26
Arkadaşlar 2. Problem hakkında fikri olan varmı?  Örneğin 1khz sabit frekans uygulasam ve bu frekansı temsil eden bandın değeri neden sürekli olarak değişir.

Birde FPS konusu var.


Genel olarak aklıma gelenler:

Rutinlerde her hesaplama başlangıcında sıfırlanması vs gereken değerler sıfırlanmıyordur/ ilk değer atanmıyordur.
Fix point hesaplama yapıldıysa overflow durumları kontrol edilmemiştir. (Belki orjinal rutinler 8 bit içindir ama sen 10 bit için kullanıyorsundur.)
Sample alma süresi değişkendir.
Belki ADC rutini sorunludur.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Mucit23

Sample alma süresi sabit hocam. Kesinlikle eminim. Direk osiloskopla ölçüyorum çünkü.

Ben dediğim gibi FFT fonksiyonunda problem olduğunu düşünüyorum. Çünkü Orjinal devrede 10bit ADC var. Ben ise 12Bit ADC kullanıyorum, OverFlow problemleri olabilir.

İlk başta ADC bufferinden değerleri alırken sanal değerleri sıfırlıyorum.

Yazdığım kodlar bunlar.

/* Includes ------------------------------------------------------------------*/
  #include "main.h"
/** @addtogroup 
  * @{
  */

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Bits definitions ----------------------------------------------------------*/
#define pi 3.1415926535 
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
   static __IO uint32_t TimingDelay;
	 extern __IO uint16_t ADC3ConvertedValue[64];
	 extern __IO uint8_t ADC_Ready_Flag;
	 uint16_t dizi[32];
	 char data[20];
	 uint8_t value=0;
	 //FFT Variables
   short imaginaryNumbers[64];
   short realNumbers[64];	 
	 int i=0, k=0, z=0, place=0, root=0;
	 
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/

int main()
{
	if (SysTick_Config(SystemCoreClock / 3119))//1ms 
  { 
    /* Capture error */ 
    while (1);
  }
	STM_EVAL_LEDInit(LED3);
  /* LCD Configuration */
  SSD1963_Init(); 
  /* ADC Configuration */ 	
  ADC_Configuration();

	LCD_Clear(BLACK);
	LCD_SetFont(&Font8x8);
	LCD_SetColors(GREEN,BLACK);
	//ADC_SoftwareStartConv(ADC3);
	       //old bargraph function 1.840ms      
	
	while(1)
	{
	 if(ADC_Ready_Flag)
	 {
	   for(i=0;i<64;i++)
	   {
	    	realNumbers[i]=ADC3ConvertedValue[i]-2048;
		    imaginaryNumbers[i]=0;
	   }
		 ADC_Ready_Flag=0;
		 
		 fix_fft(realNumbers, imaginaryNumbers, 6);
		
     for (k=0; k < 32; k++)
     {
	        realNumbers[k] = (realNumbers[k] * realNumbers[k] + 
                   imaginaryNumbers[k] * imaginaryNumbers[k]);
        
            place = 0x40000000;
			      root = 0;
			
			if (realNumbers[k] >= 0) // Ensure we don't have a negative number
			{
				while (place > realNumbers[k]) place = place >> 2; 
				
				while (place)  
				{  
					if (realNumbers[k] >= root + place)  
					{  
						realNumbers[k] -= root + place;  
						root += place * 2;  
					}  
					root = root >> 1;  
					place = place >> 2;  
				}
			}
			realNumbers[k] = root;
	   }
	 }
	    
	    //LCD_DrawBargraph parameter (Xpos, Ypos, Widh, Height, Value)
      LCD_DrawBargraph(0,100,3,172,realNumbers[0]);
	    LCD_DrawBargraph(15,100,3,172,realNumbers[1]);
	    LCD_DrawBargraph(30,100,3,172,realNumbers[2]);
      LCD_DrawBargraph(45,100,3,172,realNumbers[3]);
	    LCD_DrawBargraph(60,100,3,172,realNumbers[4]);
	    LCD_DrawBargraph(75,100,3,172,realNumbers[5]);
      LCD_DrawBargraph(90,100,3,172,realNumbers[6]);
	    LCD_DrawBargraph(105,100,3,172,realNumbers[7]);
	    LCD_DrawBargraph(120,100,3,172,realNumbers[8]);
      LCD_DrawBargraph(135,100,3,172,realNumbers[10]);
	    LCD_DrawBargraph(150,100,3,172,realNumbers[11]);
	    LCD_DrawBargraph(165,100,3,172,realNumbers[12]);
      LCD_DrawBargraph(180,100,3,172,realNumbers[13]);
	    LCD_DrawBargraph(195,100,3,172,realNumbers[14]);
	    LCD_DrawBargraph(210,100,3,172,realNumbers[15]);
      LCD_DrawBargraph(225,100,3,172,realNumbers[16]);
	    LCD_DrawBargraph(240,100,3,172,realNumbers[17]);
	    LCD_DrawBargraph(255,100,3,172,realNumbers[18]);
      LCD_DrawBargraph(270,100,3,172,realNumbers[19]);
	    LCD_DrawBargraph(285,100,3,172,realNumbers[20]);
	    LCD_DrawBargraph(300,100,3,172,realNumbers[21]);
      LCD_DrawBargraph(315,100,3,172,realNumbers[22]);
	    LCD_DrawBargraph(330,100,3,172,realNumbers[23]);
	    LCD_DrawBargraph(345,100,3,172,realNumbers[24]);
      LCD_DrawBargraph(360,100,3,172,realNumbers[25]);
	    LCD_DrawBargraph(375,100,3,172,realNumbers[26]);
	    LCD_DrawBargraph(390,100,3,172,realNumbers[27]);
      LCD_DrawBargraph(405,100,3,172,realNumbers[28]);
	    LCD_DrawBargraph(420,100,3,172,realNumbers[29]);
	    LCD_DrawBargraph(435,100,3,172,realNumbers[30]);
      LCD_DrawBargraph(450,100,3,172,realNumbers[31]);
			//Delay(10);//10ms Delay..
 	}
}


/**
  * @brief  Inserts a delay time.
  * @param  nTime: specifies the delay time length, in milliseconds.
  * @retval None
  */
void Delay(__IO uint32_t nTime)
{ 
  TimingDelay = nTime;

  while(TimingDelay != 0);
}

/**
  * @brief  Decrements the TimingDelay variable.
  * @param  None
  * @retval None
  */
void TimingDelay_Decrement(void)
{
  if (TimingDelay != 0x00)
  { 
    TimingDelay--;
  }
}


Aslında ADCyi 10bit yapmayı hiç denemedim. Akşam deneyelim. Bakalım ne olacak.

SpeedyX

Gözüme takıldığı için yazıyorum,

realNumbers[9] unutulmuş. 1 bar kayma var.

GLCD kısmını şöyle de yapabilirsin;
for(i = 0; i < 32; i++)
{
	LCD_DrawBargraph(i*15,100,3,172,realNumbers[i]);
}

Mucit23

İlk başlarda bargraph fonksiyonu sıkıntılıydı hocam. Ozaman böyle ard arda yazma ihityacı bulmuştum. Bir tanesini atlamışım...


Mucit23

ADC yi 10 bit yapıp denedim. Sonuç birazdaha iyi, En azından daha sakin bir şekilde çalışıyor. Demekki overflow durumları oluşuyor. Bu sizce nerede olabilir?
FFT Kütüphanesi budur
/************************************************************************
	fft.c

    FFT Audio Analysis
    Copyright (C) 2011 Simon Inns

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.

	Email: simon.inns@gmail.com

************************************************************************/
#ifndef FFT_C
#define FFT_C

#include "stm32f4xx.h"
#include "fft.h"

// fix_fft.c - Fixed-point in-place Fast Fourier Transform

// All data are fixed-point short integers, in which -32768
// to +32768 represent -1.0 to +1.0 respectively. Integer
// arithmetic is used for speed, instead of the more natural
// floating-point.
//
// For the forward FFT (time -> freq), fixed scaling is
// performed to prevent arithmetic overflow, and to map a 0dB
// sine/cosine wave (i.e. amplitude = 32767) to two -6dB freq
// coefficients.
//
// Written by:  Tom Roberts  11/8/89
// Made portable:  Malcolm Slaney 12/15/94 malcolm@interval.com
// Enhanced:  Dimitrios P. Bouras  14 Jun 2006 dbouras@ieee.org
// Ported to PIC18F:  Simon Inns 20110104

/*
  fix_fft() - perform forward fast Fourier transform.
  fr[n],fi[n] are real and imaginary arrays, both INPUT AND
  RESULT (in-place FFT), with 0 <= n < 2**m
*/

// Since we only use 3/4 of N_WAVE, we define only
// this many samples, in order to conserve data space.
const short Sinewave[N_WAVE-N_WAVE/4] = {
      0,    201,    402,    603,    804,   1005,   1206,   1406,
   1607,   1808,   2009,   2209,   2410,   2610,   2811,   3011,
   3211,   3411,   3611,   3811,   4011,   4210,   4409,   4608,
   4807,   5006,   5205,   5403,   5601,   5799,   5997,   6195,
   6392,   6589,   6786,   6982,   7179,   7375,   7571,   7766,
   7961,   8156,   8351,   8545,   8739,   8932,   9126,   9319,
   9511,   9703,   9895,  10087,  10278,  10469,  10659,  10849,
  11038,  11227,  11416,  11604,  11792,  11980,  12166,  12353,
  12539,  12724,  12909,  13094,  13278,  13462,  13645,  13827,
  14009,  14191,  14372,  14552,  14732,  14911,  15090,  15268,
  15446,  15623,  15799,  15975,  16150,  16325,  16499,  16672,
  16845,  17017,  17189,  17360,  17530,  17699,  17868,  18036,
  18204,  18371,  18537,  18702,  18867,  19031,  19194,  19357,
  19519,  19680,  19840,  20000,  20159,  20317,  20474,  20631,
  20787,  20942,  21096,  21249,  21402,  21554,  21705,  21855,
  22004,  22153,  22301,  22448,  22594,  22739,  22883,  23027,
  23169,  23311,  23452,  23592,  23731,  23869,  24006,  24143,
  24278,  24413,  24546,  24679,  24811,  24942,  25072,  25201,
  25329,  25456,  25582,  25707,  25831,  25954,  26077,  26198,
  26318,  26437,  26556,  26673,  26789,  26905,  27019,  27132,
  27244,  27355,  27466,  27575,  27683,  27790,  27896,  28001,
  28105,  28208,  28309,  28410,  28510,  28608,  28706,  28802,
  28897,  28992,  29085,  29177,  29268,  29358,  29446,  29534,
  29621,  29706,  29790,  29873,  29955,  30036,  30116,  30195,
  30272,  30349,  30424,  30498,  30571,  30643,  30713,  30783,
  30851,  30918,  30984,  31049,  31113,  31175,  31236,  31297,
  31356,  31413,  31470,  31525,  31580,  31633,  31684,  31735,
  31785,  31833,  31880,  31926,  31970,  32014,  32056,  32097,
  32137,  32176,  32213,  32249,  32284,  32318,  32350,  32382,
  32412,  32441,  32468,  32495,  32520,  32544,  32567,  32588,
  32609,  32628,  32646,  32662,  32678,  32692,  32705,  32717,
  32727,  32736,  32744,  32751,  32757,  32761,  32764,  32766,
  32767,  32766,  32764,  32761,  32757,  32751,  32744,  32736,
  32727,  32717,  32705,  32692,  32678,  32662,  32646,  32628,
  32609,  32588,  32567,  32544,  32520,  32495,  32468,  32441,
  32412,  32382,  32350,  32318,  32284,  32249,  32213,  32176,
  32137,  32097,  32056,  32014,  31970,  31926,  31880,  31833,
  31785,  31735,  31684,  31633,  31580,  31525,  31470,  31413,
  31356,  31297,  31236,  31175,  31113,  31049,  30984,  30918,
  30851,  30783,  30713,  30643,  30571,  30498,  30424,  30349,
  30272,  30195,  30116,  30036,  29955,  29873,  29790,  29706,
  29621,  29534,  29446,  29358,  29268,  29177,  29085,  28992,
  28897,  28802,  28706,  28608,  28510,  28410,  28309,  28208,
  28105,  28001,  27896,  27790,  27683,  27575,  27466,  27355,
  27244,  27132,  27019,  26905,  26789,  26673,  26556,  26437,
  26318,  26198,  26077,  25954,  25831,  25707,  25582,  25456,
  25329,  25201,  25072,  24942,  24811,  24679,  24546,  24413,
  24278,  24143,  24006,  23869,  23731,  23592,  23452,  23311,
  23169,  23027,  22883,  22739,  22594,  22448,  22301,  22153,
  22004,  21855,  21705,  21554,  21402,  21249,  21096,  20942,
  20787,  20631,  20474,  20317,  20159,  20000,  19840,  19680,
  19519,  19357,  19194,  19031,  18867,  18702,  18537,  18371,
  18204,  18036,  17868,  17699,  17530,  17360,  17189,  17017,
  16845,  16672,  16499,  16325,  16150,  15975,  15799,  15623,
  15446,  15268,  15090,  14911,  14732,  14552,  14372,  14191,
  14009,  13827,  13645,  13462,  13278,  13094,  12909,  12724,
  12539,  12353,  12166,  11980,  11792,  11604,  11416,  11227,
  11038,  10849,  10659,  10469,  10278,  10087,   9895,   9703,
   9511,   9319,   9126,   8932,   8739,   8545,   8351,   8156,
   7961,   7766,   7571,   7375,   7179,   6982,   6786,   6589,
   6392,   6195,   5997,   5799,   5601,   5403,   5205,   5006,
   4807,   4608,   4409,   4210,   4011,   3811,   3611,   3411,
   3211,   3011,   2811,   2610,   2410,   2209,   2009,   1808,
   1607,   1406,   1206,   1005,    804,    603,    402,    201,
      0,   -201,   -402,   -603,   -804,  -1005,  -1206,  -1406,
  -1607,  -1808,  -2009,  -2209,  -2410,  -2610,  -2811,  -3011,
  -3211,  -3411,  -3611,  -3811,  -4011,  -4210,  -4409,  -4608,
  -4807,  -5006,  -5205,  -5403,  -5601,  -5799,  -5997,  -6195,
  -6392,  -6589,  -6786,  -6982,  -7179,  -7375,  -7571,  -7766,
  -7961,  -8156,  -8351,  -8545,  -8739,  -8932,  -9126,  -9319,
  -9511,  -9703,  -9895, -10087, -10278, -10469, -10659, -10849,
 -11038, -11227, -11416, -11604, -11792, -11980, -12166, -12353,
 -12539, -12724, -12909, -13094, -13278, -13462, -13645, -13827,
 -14009, -14191, -14372, -14552, -14732, -14911, -15090, -15268,
 -15446, -15623, -15799, -15975, -16150, -16325, -16499, -16672,
 -16845, -17017, -17189, -17360, -17530, -17699, -17868, -18036,
 -18204, -18371, -18537, -18702, -18867, -19031, -19194, -19357,
 -19519, -19680, -19840, -20000, -20159, -20317, -20474, -20631,
 -20787, -20942, -21096, -21249, -21402, -21554, -21705, -21855,
 -22004, -22153, -22301, -22448, -22594, -22739, -22883, -23027,
 -23169, -23311, -23452, -23592, -23731, -23869, -24006, -24143,
 -24278, -24413, -24546, -24679, -24811, -24942, -25072, -25201,
 -25329, -25456, -25582, -25707, -25831, -25954, -26077, -26198,
 -26318, -26437, -26556, -26673, -26789, -26905, -27019, -27132,
 -27244, -27355, -27466, -27575, -27683, -27790, -27896, -28001,
 -28105, -28208, -28309, -28410, -28510, -28608, -28706, -28802,
 -28897, -28992, -29085, -29177, -29268, -29358, -29446, -29534,
 -29621, -29706, -29790, -29873, -29955, -30036, -30116, -30195,
 -30272, -30349, -30424, -30498, -30571, -30643, -30713, -30783,
 -30851, -30918, -30984, -31049, -31113, -31175, -31236, -31297,
 -31356, -31413, -31470, -31525, -31580, -31633, -31684, -31735,
 -31785, -31833, -31880, -31926, -31970, -32014, -32056, -32097,
 -32137, -32176, -32213, -32249, -32284, -32318, -32350, -32382,
 -32412, -32441, -32468, -32495, -32520, -32544, -32567, -32588,
 -32609, -32628, -32646, -32662, -32678, -32692, -32705, -32717,
 -32727, -32736, -32744, -32751, -32757, -32761, -32764, -32766,
};

void fix_fft(short fr[], short fi[], short m)
{
	int mr = 0, nn, i, j, l, k, istep, n;
	short qr, qi, tr, ti, wr, wi;

	n = 1 << m;
	nn = n - 1;

	/* max FFT size = N_WAVE */
	//if (n > N_WAVE) return -1;

	/* decimation in time - re-order data */
	for (m=1; m<=nn; ++m)
	{
		l = n;
		do
		{
			l >>= 1;
		} while (mr+l > nn);
		
		mr = (mr & (l-1)) + l;
		if (mr <= m) continue;
		
		tr = fr[m];
		fr[m] = fr[mr];
		fr[mr] = tr;
		ti = fi[m];
		fi[m] = fi[mr];
		fi[mr] = ti;
	}

	l = 1;
	k = LOG2_N_WAVE-1;
	
	while (l < n)
	{
		/*
		  fixed scaling, for proper normalization --
		  there will be log2(n) passes, so this results
		  in an overall factor of 1/n, distributed to
		  maximize arithmetic accuracy.

		  It may not be obvious, but the shift will be
		  performed on each data point exactly once,
		  during this pass.
		*/
		
		// Variables for multiplication code
		long int c;
		short b;
		
		istep = l << 1;
		for (m=0; m<l; ++m)
		{
			j = m << k;
			/* 0 <= j < N_WAVE/2 */
			wr =  Sinewave[j+N_WAVE/4];
			wi = -Sinewave[j];

			wr >>= 1;
			wi >>= 1;
			
			for (i=m; i<n; i+=istep)
			{
				j = i + l;
				
				// Here I unrolled the multiplications to prevent overhead
				// for procedural calls (we don't need to be clever about 
				// the actual multiplications since the pic has an onboard
				// 8x8 multiplier in the ALU):
				
				// tr = FIX_MPY(wr,fr[j]) - FIX_MPY(wi,fi[j]);
				c = ((long int)wr * (long int)fr[j]);
				c = c >> 14;
				b = c & 0x01;
				tr = (c >> 1) + b;
				
				c = ((long int)wi * (long int)fi[j]);
				c = c >> 14;
				b = c & 0x01;
				tr = tr - ((c >> 1) + b);
				
				// ti = FIX_MPY(wr,fi[j]) + FIX_MPY(wi,fr[j]);
				c = ((long int)wr * (long int)fi[j]);
				c = c >> 14;
				b = c & 0x01;
				ti = (c >> 1) + b;
				
				c = ((long int)wi * (long int)fr[j]);
				c = c >> 14;
				b = c & 0x01;
				ti = ti + ((c >> 1) + b);
				
				qr = fr[i];
				qi = fi[i];
				qr >>= 1;
				qi >>= 1;

				fr[j] = qr - tr;
				fi[j] = qi - ti;
				fr[i] = qr + tr;
				fi[i] = qi + ti;
			}
		}
		
		--k;
		l = istep;
	}
}

#endif


FFT fonksiyonunda M parametresi var. Fonksiyon kullanılırken sabit 6 değeri gönderiliyor. Bu nedir sizce

z

realNumbers=ADC3ConvertedValue-2048;

bu gibi ifadeleri 10 bit icin duzelt. Ama bu zaten 12 bit icin yazilmis gorunuyor.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Mucit23

Hocam yok 10Bit Testlerinde onları zaten düzeltmiştim. O işlemi 12 bit ADC için yapıyorum.

superconductor

O parametre fft fonksiyonuna gonderecegin dizi eleman sayisinin 2 tabanindaki logaritmasi hocam.

Mucit23

Yarım yamalakta olsa kütüphane bir şekilde çalışıyor, fakat ben hiç memnun değilim.
http://www.waitingforfriday.com/index.php/Real-Time_Audio_Spectrum_Analyser
Hocam bu uygulamayı yapan adama mail attım 12Bit ADC için durumu anlattım.  Adam bana bu kodlar 10 bit ADC  sinyalini işlemek için tasarlanmış diyor. Bana Fast Hardley Transformu öneriyor. Biraz daha farklı bir konu.

@superconductor, Hocam siz kendi çalışmalarınızdan FFT ile ilgili rutinlerinizi paylaşmanız mümkünmü?


superconductor

Pc ye gecince paylasayim hocam. Ben bahsettigin ayni frekans ve genlikte sinyal uygulandiginda olusan dalgalanmayi, bar degerlerini low-pass filtreye sokarak kismen cozdum. Anladigim kadari ile bu algoritmayi yazan arkadas pic4550 de rahat calissin diye baya optimize etmis. Dikkat ettiysen kendi uygulamasida aslinda cok iyi calismiyor. Ozellikle iki kesim frekansi arasinda kalan bir sinyal uygulaninca cevredeki barlarda dalgalanma yapiyor. Iki uc harmonikle denedigimde bu olay daha cok belli oldu. Ben dma ile adc degerlerini diziye atiyorum 64 eleman dolunca o diziyi fft islemine sokuyorum. Bu sirada dma bir sonraki fft islemi icin diziye adc degerlerini kopyaliyor. Simdi aklima geldi bir hatami buldum. Fft islemi daha bitemeden dma dizinin ilk elemanlarini degistiriyor olabilir bakmak lazim. Bunun onune iki tane buffer kullanilarak gecilebilir. Dsp library kullanmayi bir turlu cozemedim  onun uzerine gitmek lazim diye dusunuyorum bol ornek var fft icin.