// returns the peak frequency uint16_t fftSingleCycle() { // 10 bits to 6 bits unsigned, range [0, 63] // then shift so have range [-32, 31] uint16_t start_t = TMR0; for (int i = 0; i < FFT_LEN; i++) fftReal[i] = readADC(); uint16_t stop_t = TMR0; // pre-process for the fft for (int i = 0; i < FFT_LEN; i++) fftReal[i] = (int16_t)((uint16_t)fftReal[i] >> 4) - 31; // Timer clock is Fosc/4, so do >>2 sample_freq = (_XTAL_FREQ << (FFT_LEN_BITS))/((stop_t > start_t) ? (stop_t - start_t) : (65536 - start_t + stop_t)); // Reset the imaginary array for (int i = 0; i < FFT_LEN; i++) fftImag[i] = 0; max_index = optfft(fftReal, fftImag); peak_freq = (max_index * sample_freq) >> (FFT_LEN_BITS+2); return (uint16_t)peak_freq; }
void ekgProcess(void* taskDataPtr) { EKGData* ekgDataPtr = (EKGData*) taskDataPtr; unsigned int freq = 0; while(1) { EKGData* ekgDataPtr = (EKGData*) taskDataPtr; // scale buffer input for(int i = 0; i < 256; i++) { ekgDataPtr->EKGRawTempBuf[i] = 0; ekgDataPtr->EKGRawBuf[i] = (ekgDataPtr->EKGRawBuf[i] >> 4) - 32; } freq = optfft(ekgDataPtr->EKGRawBuf,ekgDataPtr->EKGRawTempBuf); freq = Fs*freq / N; //UARTprintf("Freq: %d\n",freq); cBuffPut(ekgDataPtr->EKGFreqBuf,&freq); vTaskSuspend(NULL); } }