📄 interspectrum.c
字号:
#include <stdio.h>
#include "../include/audio_main.h"
#ifdef SPECTRUM
#define FFT_BUFFER_SIZE 128
#define SPECTRUM_LINE_M 20
#define SPECTRUM_DBLEVEL_N 21
#define SPECTRUM_DBLEVEL_46 46
#define SPECTRUM_LINE_64 64
unsigned short Spectrum_gLinePow[SPECTRUM_LINE_M];//存放转换过后的M根谱线的能量
//完成64×46频谱图到M*N频谱图的变换
void Spectrum_Norm(unsigned short * SpectrumLineDBBuf , long SampleRate)
{
unsigned short LineDeltaM;//相邻两条谱线的间隔;
unsigned short loop0;
unsigned short powsum;
unsigned short loop1;
unsigned short spectrumdbtable[SPECTRUM_DBLEVEL_N] = {0, 18, 20, 22,
24, 26, 27, 28,
29, 30, 31, 32,
33, 34, 35, 36,
37, 39, 40, 41,
46
};
unsigned short spectrumdbnumber = 0;
LineDeltaM = (unsigned short)(SampleRate / FFT_BUFFER_SIZE);
switch (SampleRate)
{
case 48000:
#if 0
loop1 = 0;
for (loop0 = 0; loop0 < SPECTRUM_LINE_M - 10; loop0++)
{
Spectrum_gLinePow[loop0] = (unsigned short)(SpectrumLineDBBuf[loop1++] *
(1.0 * SPECTRUM_DBLEVEL_N / SPECTRUM_DBLEVEL_46));//前面10根谱线能量取原值,间隔为375hz,范围0hz-3750hz
}
//loop1 = loop0;
for (;loop0 < SPECTRUM_LINE_M;loop0++)//3750Hz后的10根谱线是以5个为一组取平均值算1根,间隔为1875hz=375*5
{
powsum = SpectrumLineDBBuf[loop1++] + SpectrumLineDBBuf[loop1++] + SpectrumLineDBBuf[loop1++] +
SpectrumLineDBBuf[loop1++] + SpectrumLineDBBuf[loop1++];
Spectrum_gLinePow[loop0] = (unsigned short)((powsum / 5.0) * (1.0 * SPECTRUM_DBLEVEL_N / SPECTRUM_DBLEVEL_46));
}
#endif
loop1 = 0;
for (loop0 = 0; loop0 < SPECTRUM_LINE_M - 10; loop0++)
{
spectrumdbnumber = 0;
while ((SpectrumLineDBBuf[loop1] >= spectrumdbtable[spectrumdbnumber]) && (spectrumdbnumber < 21))//通过查表求解db序号
{
spectrumdbnumber++;
}
Spectrum_gLinePow[loop0] = (unsigned short)(spectrumdbnumber);//前面10根谱线能量取原值,间隔为375hz,范围0hz-3750hz
loop1++;
}
//loop1 = loop0;
for (;loop0 < SPECTRUM_LINE_M;loop0++)//3750Hz后的10根谱线是以5个为一组取平均值算1根,间隔为1875hz=375*5
{
powsum = SpectrumLineDBBuf[loop1++] + SpectrumLineDBBuf[loop1++] + SpectrumLineDBBuf[loop1++] +
SpectrumLineDBBuf[loop1++] + SpectrumLineDBBuf[loop1++];
powsum = (unsigned short)(powsum / 5.0);
spectrumdbnumber = 0;
while ((powsum >= spectrumdbtable[spectrumdbnumber]) && (spectrumdbnumber < 21))//通过查表求解db序号
{
spectrumdbnumber++;
}
Spectrum_gLinePow[loop0] = (unsigned short)spectrumdbnumber;
}
break;
case 44100:
#if 0
loop1 = 0;
for (loop0 = 0; loop0 < SPECTRUM_LINE_M - 10; loop0++)
{
Spectrum_gLinePow[loop0] = (unsigned short)(SpectrumLineDBBuf[loop1++] *
(1.0 * SPECTRUM_DBLEVEL_N / SPECTRUM_DBLEVEL_46));//前面10根谱线能量取原值,间隔为344.5hz,范围为0hz-3445hz
}
//loop1 = loop0;
for (;loop0 < SPECTRUM_LINE_M;loop0++)//3445Hz后的10谱线是以5个为一组取平均值算1根,间隔为1772hz=344.5*5
{
powsum = SpectrumLineDBBuf[loop1++] + SpectrumLineDBBuf[loop1++] + SpectrumLineDBBuf[loop1++] +
SpectrumLineDBBuf[loop1++] + SpectrumLineDBBuf[loop1++];
Spectrum_gLinePow[loop0] = (unsigned short)((powsum / 5.0) * (1.0 * SPECTRUM_DBLEVEL_N / SPECTRUM_DBLEVEL_46));
}
#endif
loop1 = 0;
for (loop0 = 0; loop0 < SPECTRUM_LINE_M - 10; loop0++)
{
spectrumdbnumber = 0;
while ((SpectrumLineDBBuf[loop1] >= spectrumdbtable[spectrumdbnumber]) && (spectrumdbnumber < 21))//通过查表求解db序号
{
spectrumdbnumber++;
}
Spectrum_gLinePow[loop0] = (unsigned short)(spectrumdbnumber);//前面10根谱线能量取原值,间隔为344.5hz,范围为0hz-3445hz
loop1++;
}
//loop1 = loop0;
for (;loop0 < SPECTRUM_LINE_M;loop0++)//3445Hz后的10谱线是以5个为一组取平均值算1根,间隔为1772hz=344.5*5
{
powsum = SpectrumLineDBBuf[loop1++] + SpectrumLineDBBuf[loop1++] + SpectrumLineDBBuf[loop1++] +
SpectrumLineDBBuf[loop1++] + SpectrumLineDBBuf[loop1++];
powsum = (unsigned short)(powsum / 5.0);
spectrumdbnumber = 0;
while ((powsum >= spectrumdbtable[spectrumdbnumber]) && (spectrumdbnumber < 21))//通过查表求解db序号
{
spectrumdbnumber++;
}
Spectrum_gLinePow[loop0] = (unsigned short)spectrumdbnumber;
}
break;
case 32000:
#if 0
loop1 = 0;
for (loop0 = 0; loop0 < SPECTRUM_LINE_M - 10; loop0++)
{
Spectrum_gLinePow[loop0] = (unsigned short)(SpectrumLineDBBuf[loop1++] *
(1.0 * SPECTRUM_DBLEVEL_N / SPECTRUM_DBLEVEL_46));//前面10根谱线能量取原值,间隔为250hz,范围为0hz-2500hz
}
//loop1 = loop0;
for (;loop0 < SPECTRUM_LINE_M;loop0++)//2500Hz后的10谱线是以5个为一组取平均值算1根,间隔为1250hz=250*5
{
powsum = SpectrumLineDBBuf[loop1++] + SpectrumLineDBBuf[loop1++] + SpectrumLineDBBuf[loop1++] +
SpectrumLineDBBuf[loop1++] + SpectrumLineDBBuf[loop1++];
Spectrum_gLinePow[loop0] = (unsigned short)((powsum / 5.0) * (1.0 * SPECTRUM_DBLEVEL_N / SPECTRUM_DBLEVEL_46));
}
#endif
loop1 = 0;
for (loop0 = 0; loop0 < SPECTRUM_LINE_M - 10; loop0++)
{
spectrumdbnumber = 0;
while ((SpectrumLineDBBuf[loop1] >= spectrumdbtable[spectrumdbnumber]) && (spectrumdbnumber < 21))//通过查表求解db序号
{
spectrumdbnumber++;
}
Spectrum_gLinePow[loop0] = (unsigned short)(spectrumdbnumber);//前面10根谱线能量取原值,间隔为250hz,范围为0hz-2500hz
loop1++;
}
//loop1 = loop0;
for (;loop0 < SPECTRUM_LINE_M;loop0++)//2500Hz后的10谱线是以5个为一组取平均值算1根,间隔为1250hz=250*5
{
powsum = SpectrumLineDBBuf[loop1++] + SpectrumLineDBBuf[loop1++] + SpectrumLineDBBuf[loop1++] +
SpectrumLineDBBuf[loop1++] + SpectrumLineDBBuf[loop1++];
powsum = (unsigned short)(powsum / 5.0);
spectrumdbnumber = 0;
while ((powsum >= spectrumdbtable[spectrumdbnumber]) && (spectrumdbnumber < 21))//通过查表求解db序号
{
spectrumdbnumber++;
}
Spectrum_gLinePow[loop0] = (unsigned short)spectrumdbnumber;
}
break;
case 24000:
#if 0
loop1 = 0 ;
for (loop0 = 0; loop0 < SPECTRUM_LINE_M - 10; loop0++)//前面10根谱线能量取2根为一组原值,每组跨度375=2×187.5hz,频率范围为0hz-3750hz
{
powsum = SpectrumLineDBBuf[loop1++] + SpectrumLineDBBuf[loop1++];
Spectrum_gLinePow[loop0] = (unsigned short)((powsum / 2.0) * (1.0 * SPECTRUM_DBLEVEL_N / SPECTRUM_DBLEVEL_46));
}
for (;loop0 < SPECTRUM_LINE_M;loop0++)//3750Hz后的10谱线是以4个为一组取平均值算1根,间隔为750hz=187.5*4,范围3750hz-11250hz
{
powsum = SpectrumLineDBBuf[loop1++] + SpectrumLineDBBuf[loop1++] + SpectrumLineDBBuf[loop1++] +
SpectrumLineDBBuf[loop1++];
Spectrum_gLinePow[loop0] = (unsigned short)((powsum / 4.0) * (1.0 * SPECTRUM_DBLEVEL_N / SPECTRUM_DBLEVEL_46));
}
#endif
loop1 = 0 ;
for (loop0 = 0; loop0 < SPECTRUM_LINE_M - 10; loop0++)//前面10根谱线能量取2根为一组原值,每组跨度375=2×187.5hz,频率范围为0hz-3750hz
{
powsum = SpectrumLineDBBuf[loop1++] + SpectrumLineDBBuf[loop1++];
powsum = (unsigned short)(powsum / 2.0);
spectrumdbnumber = 0;
while ((powsum >= spectrumdbtable[spectrumdbnumber]) && (spectrumdbnumber < 21))//通过查表求解db序号
{
spectrumdbnumber++;
}
Spectrum_gLinePow[loop0] = (unsigned short)spectrumdbnumber;
}
for (;loop0 < SPECTRUM_LINE_M;loop0++)//3750Hz后的10谱线是以4个为一组取平均值算1根,间隔为750hz=187.5*4,范围3750hz-11250hz
{
powsum = SpectrumLineDBBuf[loop1++] + SpectrumLineDBBuf[loop1++] + SpectrumLineDBBuf[loop1++] +
SpectrumLineDBBuf[loop1++];
powsum = (unsigned short)(powsum / 4.0);
spectrumdbnumber = 0;
while ((powsum >= spectrumdbtable[spectrumdbnumber]) && (spectrumdbnumber < 21))//通过查表求解db序号
{
spectrumdbnumber++;
}
Spectrum_gLinePow[loop0] = (unsigned short)spectrumdbnumber;
}
break;
case 22050:
#if 0
loop1 = 0 ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -