⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 interspectrum.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -