xref: /MusicPlayer2/MusicPlayer2/SpectralDataHelper.cpp (revision 4df46f80c2a71e4cf062c2f4a97c6bb43853680a)
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