wirelessgateway/utility/Caculation.h

202 lines
6.1 KiB
C
Raw Normal View History

2021-09-18 13:45:24 +08:00
#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 &amplitude, 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 &amplitude, 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