при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Не за что, не за что.Персональное спасибо YS за спокойный и вразумительный ликбез!
Код: Выделить всё
#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;
}
Цикл 64 раза по 64 раза. Вот и выходит, если частота одна - на ней и выходит максимум (4096, если без ошибок округления), если комбинация частот - суммарная амплитуда тоже будет такой.Код: Выделить всё
for(i=0; i<DFT_SIZE; i++) { for(j=0; j<DFT_SIZE; j++){
Игорь Николаевич, я простил, да!INA писал(а):Добрый вечер всем!
Продолжив тему про FFT, написал небольшую софтинку под Android...![]()
Вот то, что получилось: https://youtu.be/eDiQ7_FXkuk
Это немножко не в эту тему форума... надеюсь, меня простят...
Код: Выделить всё
{
for(i1=0; i1<32; i1++)
{
A[i1]=read_adc(0x20);
}
re = im = 0x0000;
for(i2=0;i2<32;i2++)
{
for(i4=0;i4<16;i4++)
{
smim = A[i2]*sin16[i4];
smre = A[i2]*cos16[i4];
im = im + smim;
re = re + smre;
}
}
tempsqr=(re*re)+(im*im);
am=iqrt(tempsqr);
Если мне нужны амплитуды, например 1кГц и 5кГц, то я выбрасываю верхний цикл и отдельно считаю для k=(fгарм * SIZE) / fдискр.jordan писал(а):Код: Выделить всё
for (int k = 0; k < 1024; k++) { for (int n = 0; n < 1024; n++) { x_real[k] += x_n[n] * Math.Cos( (-2) * Math.PI * k * n / 1024 ); x_imag[k] += x_n[n] * Math.Sin( (-2) * Math.PI * k * n / 1024); } x_Ampl[k] = Math.Sqrt( x_real[k] * x_real[k] + x_imag[k] * x_imag[k] ); }
Получается верно)NebelWefer писал(а): Если мне нужны амплитуды, например 1кГц и 5кГц, то я выбрасываю верхний цикл и отдельно считаю для k=(fгарм * SIZE) / fдискр.
к1=1000*1024/40000= 25 или 26,
к2=5000*1024/40000= 128
Верно ли я вывел?
Получается при большем массиве результат точнее?КРАМ писал(а):Энергия сигнала попадающего ровно между фильтрами поровну распределится между этими фильтрами.
Код: Выделить всё
const short sin_k1[N] = {10000, 9998 .......}Код: Выделить всё
x_real[k] += x_n[n] * Math.Cos( (-2) * Math.PI * k * n / 1024 );Код: Выделить всё
x_real[k] += x_n[n] *sin_k1[n]/10000