Здравствуйте!
Есть сигнал который подвергается дискретному преобразованию фурье.
На выходе ДПФ есть мнимая и действительная части, корень из суммы квадратов которых есть амплитуда определенной частоты в сигнале.
Вот написал небольшую программку, которая генерирует сигнал и проводит над ним прямое преобразование фурье:
Код:
|
#include "stdafx.h"
#include ‹stdio.h›
#include ‹math.h›
#include ‹string.h›
#define PI 3.141592653589793238462643383279
#define SAMPLERATE 8000
#define signal1_HZ 125
#define signal2_HZ 375
#define DFT_SIZE 64 // êîëè÷åñòâî âûáîðîê äëÿ ÄÏÔ
signed char buff[SAMPLERATE];
float fbuf[SAMPLERATE];
void Generate (void)
{
FILE* myfile;
FILE* file;
int i;
int ch;
myfile = fopen("C:\\file.wav", "w");
for( i = 0; i ‹ SAMPLERATE ;i++)
{
fbuf[i]=64*((sin(2*PI*i*signal1_HZ/SAMPLERATE))+(sin(0.8+2*PI*i*signal2_HZ/SAMPLERATE))); // äâà ñèíóñà
//fbuf[i]=42*((sin(2*PI*i*signal1_HZ/SAMPLERATE))+(sin(0.8+2*PI*i*signal2_HZ/SAMPLERATE))+(sin(2*PI*i*1500/SAMPLERATE))); // òðè ñèíóñà
fputc((signed char)fbuf[i],myfile);
//printf("%f\n",fbuf[i]);
}
fclose(myfile);
}
float Re[DFT_SIZE],Im[DFT_SIZE],Ampl[DFT_SIZE],summ=0;
int main(void)
{
int i=0,j=0;
Generate();
for(i=0;i‹DFT_SIZE;i++){
for(j=0;j‹DFT_SIZE;j++){
Re[i]+=(float)fbuf[j]*cos(2*PI*i*j/DFT_SIZE);
Im[i]-=(float)fbuf[j]*sin(2*PI*i*j/DFT_SIZE);
}
Ampl[i] = (float)sqrt(Re[i]*Re[i] + Im[i]*Im[i]);
}
for(i=0;i‹DFT_SIZE;i++){
printf("Amp[%d]\t\t(%d Hz)\t = %f\n",i,(SAMPLERATE/DFT_SIZE)*i,Ampl[i]);
}
while(1);
return 0;
} |
Вот результат работы программы для сигнала - синус 125Гц + синус 375Гц:
А вот для просто синуса 375Гц:
Для понимания, вот сами сигналы:
Частота дискретизации сигнала - 8000Гц.
Теперь вопрос!
Как определить реальную амплитуду? В результатах работы программы амплитуда пляшет для двух синусов - по 2048 на частоту, для одного синуса - 4064 единиц. Что это за единицы? Как из привести к нормальному виду? И как из них получить в дб, какое значение принимать за 0Дб?