Example #1
0
// 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;
}
Example #2
0
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);
    }
}