Я только что написал реализацию dft. Вот мой код:получить результат из массива дискретного форвардного преобразования
int T = 2205;
float[] sign = new float[T];
for (int i = 0, j = 0; i < T; i++, j++)
sign[i] = (float)Math.Sin(2.0f * Math.PI * 120.0f * i/ 44100.0f);
float[] re = new float[T];
float[] im = new float[T];
float[] dft = new float[T];
for (int k = 0; k < T; k++)
{
for (int n = 0; n < T; n++)
{
re[k] += sign[n] * (float)Math.Cos(2.0f* Math.PI * k * n/T);
im[k] += sign[n] * (float)Math.Sin(2.0f* Math.PI * k * n/T);;
}
dft[k] = (float)Math.Sqrt(re[k] * re[k] + im[k] * im[k]);
}
Так выборки-частотных 44100 Гц и у меня есть 50ms сегмент 120Hz синусового волны. Согласно результату, у меня есть пик функции dft на pont 7 и 2200. Я сделал что-то неправильно, а если нет, как интерпретировать результаты?
Я пробовал метод FFT AFORGE. Heres - мой код.
int T = 2048;
float[] sign = new float[T];
AForge.Math.Complex[] input = new AForge.Math.Complex[T];
for (int i = 0; i < T; i++)
{
sign[i] = (float)Math.Sin(2.0f * Math.PI * 125.0f * i/44100.0f);
input[i].Re = sign[i];
input[i].Im = 0.0;
}
AForge.Math.FourierTransform.FFT(input, AForge.Math.FourierTransform.Direction.Forward);
AForge.Math.FourierTransform.FFT(input, AForge.Math.FourierTransform.Direction.Backward);
я ожидал получить оригинальный знак, но я получил что-то другое (функция только с положительными значениями). Это нормально? Спасибо заранее!
Спасибо за ответ! Да, мне нужно сделать приложение, которое может вычислять основную частоту голоса в реальном времени. Сначала я попробовал DFT, но после того, как мне нужно реализовать БПФ. Не могли бы вы дать мне хороший источник, как понять/реализовать его? Другое дело, если одно устройство 20 Гц, тогда я могу получить частоты только, которые можно разделить на 20? Просто, если я установил частоту, например 127 Гц, результат будет таким же, если он равен 120 Гц. – user1707045
@ user1707045 Возможно, это не то же самое, посмотрите поближе или, по крайней мере, не следует, я немного сыграл с вашим кодом, и если вы это сделаете. установите частоту до 130 Гц, вы должны получить 2 магнитных шипа на 120 Гц и 140 Гц соответствующие индексы, но оба будут иметь меньшую величину, поэтому у вас есть 2 пика, говорящих вам: «у вас синусоида где-то между 120 и 140 Гц.Это означает, что вы можете «поймать» все частоты, но чем больше образцов у вас будет, тем точнее результат. Проверьте мои изменения и ссылки, если вы google «aforge fft», вы можете найти много полезных материалов, и это только начало! –