Показать сообщение отдельно
Старый 09.10.2019, 09:39   #98
Pridnya
Senior Member
 
Регистрация: 21.01.2009
Адрес: Russia, Orel
Возраст: 40
Сообщений: 4,750
Вес репутации: 4545/133
Pridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond repute
По умолчанию Re: Быстрое преобразование Фурье. Метод разложения на множители.

Цитата:
Сообщение от Марк Посмотреть сообщение
Сие утверждение мало чем отличается от рассуждений Алекса из Бат Яма...

БПФ и ДПФ НИЧЕМ НЕ ОТЛИЧАЮТСЯ по результатам вычислений. На выходе и того и другого преобразования имеет место быть КОМПЛЕКСНЫЙ синусно-косинусный спектр. И никакие не амплитуды с фазами. Амплитуду и фазу нужно В ОБОИХ СЛУЧАЯХ считать из алгебраической формы.
Отличия БПФ и ДПФ только в объемах вычислений. Все зависит от числа требуемых фильтров. При небольшом их количестве ДПФ вычисляется более компактно в смысле числа умножений-сложений.
Марк, давайте разбираться вместе. Алекс работает с микроконтроллерами ARM, есть библиотечные функции DSP LIb. Если задать программно один сигнал - синусоиду с амплитудой 1000 и фазой 90 градусов, то как ни крути фазу в исходном сигнале, в спектре только две равных спектральных составляющих. Для 64-х точечного FFT сигнал задается так: действительный отсчет равен значению выборки, а мнимый равен нулю.
Код:
#include "main.h"
#include <math.h>  
#include "arm_math.h"  // CMSIS DSP library header.
#include "arm_const_structs.h"

#define SAMPLES     64
float Buf[SAMPLES+SAMPLES]={0};

static float testOutput[SAMPLES];    // 64 Амплитуды.
static uint32_t fftSize = SAMPLES; 
static uint32_t ifftFlag = 0; 
static uint32_t doBitReverse = 1; 
static uint32_t testIndex = 0; 
arm_status status; 
static float maxValue;
static float Amp = 1000.0F;
 
int main(void)
{
  status = ARM_MATH_SUCCESS;
  
  // #define SAMPLES 64
  // float Buf[SAMPLES+SAMPLES]= {Re0, Im0, Re1, Im1 ...};
  // Программно задаем синусоиду с амплитудой 1000, первая гармоника с фазой 90 градусов.
  for(int i=0;i<SAMPLES;i++)
  {
    int j = i*2;    
    Buf[j] = 1000.0 * sin(2.0 * 3.14159 * i / SAMPLES + 2.0 * 3.14159 * 90.0 / 360.0); // Re.
    Buf[j+1] = 1; // Im.
    printf("%f %f\n", Buf[j], Buf[j+1]);
  }

  arm_cfft_f32(&arm_cfft_sR_f32_len64, Buf, ifftFlag, doBitReverse); // FFT 64
  arm_cmplx_mag_f32(Buf, testOutput, fftSize);     
  arm_max_f32(testOutput, fftSize, &maxValue, &testIndex);
    
  Amp=(float) 2*maxValue/fftSize;
  
  for(int i=0;i<64;i++)
  { printf("testOutput[%d] = %f\n", i, testOutput[i]); }// Спектр на печать.
  
  while(1) {  }    
//    return 0;
}
И в выходном массиве получаем (между 4 и 59 около нуля):

Цитата:

testOutput[0] = 64.000000
testOutput[1] = 32000.011719
testOutput[2] = 0.036043
testOutput[3] = 0.020322
...
testOutput[60] = 0.014417
testOutput[61] = 0.020322
testOutput[62] = 0.036043
testOutput[63] = 32000.011719
Где косяк?
А вот при вычислении дискретного преобразования Фурье я еще много лет назад вычислял отдельно для каждой гармоники действительную часть, мнимую часть, амплитуду и фазу (через арктангенс).

Меня интересует, где в выходном массиве - в результате FFT (в спектре) информация о фазе?
__________________
Прогресс неизбежен.

Последний раз редактировалось Pridnya; 09.10.2019 в 09:45.
Pridnya вне форума   Ответить с цитированием