1 #include "stdafx.h"
2 #include "SpectralDataHelper.h"
3
4 const int LINEAR_SAMPLE_COUNT{ 107 };
5
CSpectralDataHelper()6 CSpectralDataHelper::CSpectralDataHelper()
7 {
8 for (int i{}; i < LINEAR_SAMPLE_COUNT; i++)
9 {
10 int m = i / 2;
11 spectrum_map[i] = m;
12 if (m >= 0 && m < SPECTRUM_COL)
13 spectrum_map_count[m]++;
14 }
15
16 for (int i{ LINEAR_SAMPLE_COUNT }; i < FFT_SAMPLE; i++)
17 {
18 int m = static_cast<int>(std::log(i) / std::log(FFT_SAMPLE) * SPECTRUM_COL);
19 if (m >= 0 && m < SPECTRUM_COL)
20 {
21 spectrum_map[i] = m;
22 spectrum_map_count[m]++;
23 }
24 }
25 }
26
SpectralDataMapOld(float fft_data[FFT_SAMPLE],float spectral_data[SPECTRUM_COL],int scale)27 void CSpectralDataHelper::SpectralDataMapOld(float fft_data[FFT_SAMPLE], float spectral_data[SPECTRUM_COL], int scale)
28 {
29 memset(spectral_data, 0, sizeof(float) * SPECTRUM_COL);
30 for (int i{}; i < FFT_SAMPLE; i++)
31 {
32 spectral_data[i / (FFT_SAMPLE / SPECTRUM_COL)] += fft_data[i];
33 }
34
35 for (int i{}; i < SPECTRUM_COL; i++)
36 {
37 spectral_data[i] /= (FFT_SAMPLE / SPECTRUM_COL);
38 spectral_data[i] = std::sqrtf(spectral_data[i]); //对每个频谱柱形的值取平方根,以减少不同频率频谱值的差异
39 spectral_data[i] *= scale;
40 }
41 }
42
SpectralDataMap(float fft_data[FFT_SAMPLE],float spectral_data[SPECTRUM_COL],int scale)43 void CSpectralDataHelper::SpectralDataMap(float fft_data[FFT_SAMPLE], float spectral_data[SPECTRUM_COL], int scale)
44 {
45 memset(spectral_data, 0, sizeof(float) * SPECTRUM_COL);
46 for (int i{}; i < FFT_SAMPLE; i++)
47 {
48 spectral_data[spectrum_map[i]] += fft_data[i];
49 }
50
51 for (int i{}; i < SPECTRUM_COL; i++)
52 {
53 spectral_data[i] = spectral_data[i] / spectrum_map_count[i];
54 spectral_data[i] = std::sqrtf(spectral_data[i]); //对每个频谱柱形的值取平方根,以减少不同频率频谱值的差异
55 spectral_data[i] *= scale;
56 }
57 }
58