The experiment using this program is introduced on "Interface" No.4, CQ publishing Co.,Ltd, 2015. 本プログラムを使った実験は,CQ出版社のインターフェース 2015年4月号で紹介しています.

Dependencies:   DSProcessingIO mbed

FFT_Sampling.cpp

Committer:
CQpub0Mikami
Date:
2014-07-29
Revision:
1:655f6a72e47e
Parent:
0:c740f515e0b7

File content as of revision 1:655f6a72e47e:

//--------------------------------------------------------------
// Sampling and Spectrum analysis using FFT
// Copyright (c) 2014 MIKAMI, Naoki,  2014/06/29 
//--------------------------------------------------------------

#include "mbed.h"
#include "AdcInternal.hpp"
#include "fftReal.hpp"

using namespace Mikami;

// sampling frequency
const float FS_ = 10.0e3f;
const int N_FFT_ = 256;

Adc adc_(A0);
Ticker timer_;      // for timer interrupt
DigitalIn userButton_(USER_BUTTON);
FftReal fft_(N_FFT_);

float xn_[N_FFT_+1];
volatile int count_;

// Sampling
void TimerIsr()
{
    xn_[count_] = adc_.Read();  // AD
    count_++;
}

int main()
{
    printf("Ready.\r\n");
    while(userButton_);     // wait for user button pressed
    printf("User button is pushed!\r\n");

    count_ = 0;
    timer_.attach_us(&TimerIsr, 1.0e6f/FS_);
    while (count_ < N_FFT_+1);
    timer_.detach();        // Detach TimerIsr
    printf("End of Sampling.\r\n");

    float xnW[N_FFT_];      // for windowed data
    Complex yk[N_FFT_/2+1];
    float yDb[N_FFT_/2+1];
    
    // Windowing
    float pi2N = 6.283185f/N_FFT_;
    for (int n=0; n<N_FFT_; n++)
        xnW[n] = (xn_[n+1] - xn_[n])*(0.54f - 0.46f*cosf(pi2N*n));
        
    // Execute FFT
    fft_.Execute(xnW, yk);
    
    // Square of absolute value of FFT
    for (int n=0; n<=N_FFT_/2; n++)
        yDb[n] = norm(yk[n]);
        
    // Get maximum value of yk[n]
    float max = 0;
    for (int n=0; n<=N_FFT_/2; n++)
        max = (yDb[n] > max) ? yDb[n] : max;
        
    // Normalized spectra to dB
    for (int n=0; n<=N_FFT_/2; n++)
        if (yDb[n] > 0)
            yDb[n] = 10.0f*log10f(yDb[n]/max);
        else
            yDb[n] = -100.0f;

    // Output to terminal
    float dt = 1.0e3f/FS_;
    float df = FS_/N_FFT_;
    for (int n=0; n<N_FFT_; n++)
    {
        if (n <= N_FFT_/2)
            printf("%3d, %4.1f,%8.4f, %10.4f,%6.1f\r\n",
                   n, n*dt, xn_[n], n*df, yDb[n]);
        else
            printf("%3d, %4.1f,%8.4f\r\n", n, n*dt, xn_[n]);
    }
}