Files
GyverLamp2/firmware/GyverLamp2_v0.6b/FFT_C.h
2021-02-03 23:34:17 +03:00

73 lines
1.9 KiB
C

#pragma once
#define FFT_SIZE 64 // размер выборки (кратно степени 2)
static float sinF[] = {0.0, -1.0, -0.707107, -0.382683, -0.195090, -0.098017, -0.049068, -0.024541, -0.012272, -0.006136};
void FFT(int* AVal, int* FTvl) {
int i, j, m, Mmax, Istp, count = 0;
float Tmpr, Tmpi, Tmvl[FFT_SIZE * 2];
float Wpr, Wr, Wi;
for (i = 0; i < FFT_SIZE * 2; i += 2) {
Tmvl[i] = 0;
Tmvl[i + 1] = AVal[i / 2];
}
i = j = 1;
while (i < FFT_SIZE * 2) {
if (j > i) {
Tmpr = Tmvl[i];
Tmvl[i] = Tmvl[j];
Tmvl[j] = Tmpr;
Tmpr = Tmvl[i + 1];
Tmvl[i + 1] = Tmvl[j + 1];
Tmvl[j + 1] = Tmpr;
}
i = i + 2;
m = FFT_SIZE;
while ((m >= 2) && (j > m)) {
j = j - m;
m = m >> 1;
}
j = j + m;
}
Mmax = 2;
while (FFT_SIZE * 2 > Mmax) {
Wpr = sinF[count + 1] * sinF[count + 1] * 2;
Istp = Mmax * 2;
Wr = 1;
Wi = 0;
m = 1;
while (m < Mmax) {
i = m;
m = m + 2;
Tmpr = Wr;
Tmpi = Wi;
Wr += -Tmpr * Wpr - Tmpi * sinF[count];
Wi += Tmpr * sinF[count] - Tmpi * Wpr;
while (i < FFT_SIZE * 2) {
j = i + Mmax;
Tmpr = Wr * Tmvl[j] - Wi * Tmvl[j - 1];
Tmpi = Wi * Tmvl[j] + Wr * Tmvl[j - 1];
Tmvl[j] = Tmvl[i] - Tmpr;
Tmvl[j - 1] = Tmvl[i - 1] - Tmpi;
Tmvl[i] = Tmvl[i] + Tmpr;
Tmvl[i - 1] = Tmvl[i - 1] + Tmpi;
i = i + Istp;
}
}
count++;
Mmax = Istp;
}
for (i = 0; i < FFT_SIZE; i++) {
j = i * 2;
FTvl[i] = (int)(Tmvl[j] * Tmvl[j] + Tmvl[j + 1] * Tmvl[j + 1]) >> 18;
}
}
// по мотивам https://ru.wikibooks.org/wiki/%D0%A0%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%BE%D0%B2/%D0%91%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B5_%D0%BF%D1%80%D0%B5%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%A4%D1%83%D1%80%D1%8C%D0%B5