202 lines
6.1 KiB
C
202 lines
6.1 KiB
C
|
#ifndef CACULATION_H_
|
|||
|
#define CACULATION_H_
|
|||
|
|
|||
|
#include <vector>
|
|||
|
#include <math.h>
|
|||
|
#include <fftw3.h>
|
|||
|
using namespace std;
|
|||
|
|
|||
|
class Caculation
|
|||
|
{
|
|||
|
public:
|
|||
|
Caculation();
|
|||
|
~Caculation();
|
|||
|
|
|||
|
template<typename T, int N>
|
|||
|
static T maxValue(T(&data)[N]);
|
|||
|
|
|||
|
template<typename T, int N>
|
|||
|
static T minValue(T(&data)[N]);
|
|||
|
|
|||
|
template<typename T, int N> //<2F><><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD>ֵ
|
|||
|
static T dcValue(T(&data)[N]);
|
|||
|
|
|||
|
|
|||
|
|
|||
|
template<typename T, int N> //<2F><><EFBFBD><EFBFBD>RMS
|
|||
|
static T caculateRMS(T(&data)[N]);
|
|||
|
|
|||
|
template<typename T, int N> //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|||
|
static T caculatePKtoPk(T(&data)[N]);
|
|||
|
|
|||
|
|
|||
|
//<2F><><EFBFBD>ٸ<EFBFBD><D9B8><EFBFBD>Ҷ<EFBFBD>任<EFBFBD><E4BBBB><EFBFBD><EFBFBD>
|
|||
|
static void FFT(int n, fftw_complex* in, fftw_complex* out);
|
|||
|
|
|||
|
//ͨ<><CDA8><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>ȡ
|
|||
|
//<2F><><EFBFBD><EFBFBD>ΪFFT<46>任<EFBFBD><E4BBBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3>ȼ<EFBFBD><C8BC><EFBFBD><EFBFBD>ݣ<EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>Ƶ<EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><C3B5>ķ<EFBFBD>ֵ <20><> <20><>λ
|
|||
|
static void caculateAmp_Pha(int n, fftw_complex* in, int frequency, double &litude, double &phase);
|
|||
|
|
|||
|
template <typename T> //<2F><><EFBFBD><EFBFBD>hanning<6E><67><EFBFBD><EFBFBD>
|
|||
|
static vector<T> hanning(int N, T amp);
|
|||
|
|
|||
|
template <typename T> //<2F><><EFBFBD><EFBFBD>hamming<6E><67><EFBFBD><EFBFBD>
|
|||
|
static vector<T> hamming(int N, T amp);
|
|||
|
|
|||
|
//ͳ<>Ƽ<EFBFBD><C6BC><EFBFBD>
|
|||
|
};
|
|||
|
|
|||
|
Caculation::Caculation()
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
Caculation::~Caculation()
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
/************************************************************************/
|
|||
|
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD>ֵ */
|
|||
|
/************************************************************************/
|
|||
|
template<typename T, int N>
|
|||
|
T Caculation::maxValue(T(&data)[N])
|
|||
|
{
|
|||
|
if (0 == N) return 0;
|
|||
|
T max = data[0];
|
|||
|
for (int i = 1; i < N; i++)
|
|||
|
if (max < data[i])
|
|||
|
max = data[i];
|
|||
|
return max;
|
|||
|
}
|
|||
|
|
|||
|
/************************************************************************/
|
|||
|
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD>Сֵ */
|
|||
|
/************************************************************************/
|
|||
|
template<typename T, int N>
|
|||
|
T Caculation::minValue(T(&data)[N])
|
|||
|
{
|
|||
|
if (0 == N) return 0;
|
|||
|
T min = data[0];
|
|||
|
for (int i = 1; i < N; i++)
|
|||
|
if (min > data[i])
|
|||
|
min = data[i];
|
|||
|
return min;
|
|||
|
}
|
|||
|
|
|||
|
/************************************************************************/
|
|||
|
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ƽ<EFBFBD><C6BD>ֵ */
|
|||
|
/************************************************************************/
|
|||
|
template<typename T, int N>
|
|||
|
T Caculation::dcValue(T(&data)[N])
|
|||
|
{
|
|||
|
if (0 == N) return 0;
|
|||
|
T sum = 0;
|
|||
|
for (int i = 0; i < N; i++)
|
|||
|
sum += data[i];
|
|||
|
return sum / N;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/************************************************************************/
|
|||
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>RMS */
|
|||
|
/************************************************************************/
|
|||
|
template<typename T, int N>
|
|||
|
T Caculation::caculateRMS(T(&data)[N])
|
|||
|
{
|
|||
|
if (0 == N) return 0;
|
|||
|
T fSum = 0;
|
|||
|
for (int i = 0; i < N; i++)
|
|||
|
fSum += data[i] * data[i];
|
|||
|
return sqrt(fSum / N);
|
|||
|
}
|
|||
|
|
|||
|
/************************************************************************/
|
|||
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7>ֵ */
|
|||
|
/************************************************************************/
|
|||
|
template<typename T, int N>
|
|||
|
T Caculation::caculatePKtoPk(T(&data)[N])
|
|||
|
{
|
|||
|
if (0 == N) return 0;
|
|||
|
T min = data[0];
|
|||
|
T max = data[0];
|
|||
|
for (int i = 1; i < N; i++)
|
|||
|
{
|
|||
|
if (data[i] < min) min = data[i];
|
|||
|
if (data[i] > max) max = data[i];
|
|||
|
}
|
|||
|
return max - min;
|
|||
|
}
|
|||
|
|
|||
|
/************************************************************************/
|
|||
|
/* һά<D2BB><CEAC><EFBFBD>ݵĿ<DDB5><C4BF>ٸ<EFBFBD><D9B8><EFBFBD>Ҷ<EFBFBD>任 */
|
|||
|
/************************************************************************/
|
|||
|
void Caculation::FFT(int n, fftw_complex* in, fftw_complex* out)
|
|||
|
{
|
|||
|
if (in == NULL || out == NULL) return;
|
|||
|
fftw_plan p;
|
|||
|
p = fftw_plan_dft_1d(n, in, out, FFTW_FORWARD, FFTW_ESTIMATE);
|
|||
|
fftw_execute(p);
|
|||
|
fftw_destroy_plan(p);
|
|||
|
fftw_cleanup();
|
|||
|
}
|
|||
|
|
|||
|
//************************************
|
|||
|
// Method: caculateAmp_Pha
|
|||
|
// FullName: Caculation::caculateAmp_Pha
|
|||
|
// Access: public static
|
|||
|
// Returns: void
|
|||
|
// Qualifier:
|
|||
|
// Parameter: int n
|
|||
|
// Parameter: fftw_complex * in
|
|||
|
// Parameter: int frequency
|
|||
|
// Parameter: double & amplitude
|
|||
|
// Parameter: double & phase
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǽ<EFBFBD><C7BC><EFBFBD><EFBFBD>ض<EFBFBD>Ƶ<EFBFBD>ʵķ<CAB5>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>ԭ<EFBFBD><D4AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD><C7B4><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ض<EFBFBD><D8B6><EFBFBD>Ƶ<EFBFBD>ʣ<EFBFBD>Ȼ<EFBFBD><C8BB><EFBFBD>ڸ<EFBFBD><DAB8><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD>ҷ<EFBFBD>Χ<EFBFBD><CEA7><EFBFBD>ҷ<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>λ
|
|||
|
// Ŀǰ<C4BF>ĺ<EFBFBD><C4BA><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD>Ǽ<EFBFBD><C7BC><EFBFBD>FFT<46>任<EFBFBD><E4BBBB><EFBFBD>ض<EFBFBD><D8B6><EFBFBD>ķ<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>λ
|
|||
|
// Ȼ<><C8BB><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ط<EFBFBD><D8B7><EFBFBD>Ҫ<EFBFBD>ģ<DEB8><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD>ʺ<EFBFBD>FFT<46>任<EFBFBD><E4BBBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
//************************************
|
|||
|
void Caculation::caculateAmp_Pha(int n, fftw_complex* in, int frequency, double &litude, double &phase)
|
|||
|
{
|
|||
|
int index = frequency;
|
|||
|
amplitude = 2 * sqrt((in[index][0] / n) * (in[index][0] / n) + (in[index][1] / n) * (in[index][1] / n));
|
|||
|
phase = 180 * atan(in[index][1] / in[index][0]) / M_PI;
|
|||
|
}
|
|||
|
|
|||
|
/************************************************************************/
|
|||
|
/* <20><><EFBFBD><EFBFBD>hanning<6E><67><EFBFBD><EFBFBD> */
|
|||
|
/************************************************************************/
|
|||
|
template <typename T>
|
|||
|
vector<T> Caculation::hanning(int N, T amp)
|
|||
|
{
|
|||
|
vector<T> win(N);
|
|||
|
|
|||
|
for (int i = 0; i < (N + 1) / 2; ++i)
|
|||
|
{
|
|||
|
win[i] = amp * T(0.5 - 0.5*cos(2 * M_PI*i / (N - 1)));
|
|||
|
win[N - 1 - i] = win[i];
|
|||
|
}
|
|||
|
|
|||
|
return win;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/************************************************************************/
|
|||
|
/* <20><><EFBFBD><EFBFBD>hamming<6E><67><EFBFBD><EFBFBD> */
|
|||
|
/************************************************************************/
|
|||
|
template <typename T>
|
|||
|
vector<T> Caculation::hamming(int N, T amp)
|
|||
|
{
|
|||
|
vector<T> win(N);
|
|||
|
|
|||
|
for (int i = 0; i < (N + 1) / 2; ++i)
|
|||
|
{
|
|||
|
win[i] = amp * T(0.54 - 0.46*cos(2 * M_PI*i / (N - 1.0)));
|
|||
|
win[N - 1 - i] = win[i];
|
|||
|
}
|
|||
|
|
|||
|
return win;
|
|||
|
}
|
|||
|
|
|||
|
#endif
|
|||
|
|
|||
|
|