Перейти к содержанию
    

STM32H743 FFT FLOAT INT

Удивился сравнив целочисленный вариант fft без комплексной области и вариант с плавающий точкой.

С плавающей точкой оказался быстрее процентов на 30.

void  fftf32_direct(FFTF32* pfft)
{
	int i, ip, ir, is, j, k, ki, kd, l, le, le1, le2;

	float u1, u2, t1, t2, t3, t4;

	int n   = 1 << pfft->n;
	int nv  = n >> 1;

	float     *x     = pfft->p_data;
	float     *fft_c = pfft->p_mat_c;
	uint16_t  *fft_h = pfft->p_mat_h;

	for ( i = 0 ; i < n ; i++ )
	{
		j = fft_h[i];
		if ( i < j )
		{
			t1   = x[i];
			x[i] = x[j];
			x[j] = t1;
		}
	}
	for ( l = 1 ; l <= pfft->n ; l++ )
	{
		le  = 1 << l;
		le1 = le >> 1;
		k   = n / le1;
		le2 = le >> 2;
		for ( i = 0 ; i < n ; i += le )
		{
			ip    = i + le1;
			t1    = x[i];
			t3    = x[ip];
			x[i]  = t1 + t3;
			x[ip] = t1 - t3;
		}
		if ( l > 2)
		{
			ki = 0;
			kd = nv;
			for ( j = 1 ; j < le2 ; j++)
			{
				ki += k;
				kd -= k;
				u1 = fft_c[ki];
				u2 = fft_c[kd];
				for ( i = j, ir = le1 - j ; i < n ; i += le, ir += le)
				{
					ip = i + le1;
					is = ir + le1;
					t1 = x[i];
					t2 = x[ir];
					t3 = x[ip]*u1 - x[is]*u2;
					t4 = x[is]*u1 + x[ip]*u2;

					x[i]  = t1 + t3;
					x[ir] = t1 - t3;
					x[ip] = t4 - t2;
					x[is] = t2 + t4;
				}
			}
		}
	}
};
      
void ffti32_direct(FFTI32* pfft)
{
    int i, ip, ir, is, j, k, ki, kd, l, le, le1, le2;
    int64_t u1, u2;
    int t1, t2;
    int t3, t4;
    int n   = 1 << pfft->n;
    int nv  = n >> 1;
	
    int             *x     = pfft->p_data;
    short           *fft_c = pfft->p_mat_c;
    unsigned short  *fft_h = pfft->p_mat_h;	
	
    for ( i = 0 ; i < n ; i++ )
    {
        j = fft_h[i];
        if ( i < j )
        {
            t1   = x[i];
            x[i] = x[j];
            x[j] = t1;
        }
    }
    for ( l = 1 ; l <= pfft->n ; l++ )
    {
        le  = 1 << l;
        le1 = le >> 1;
        k   = n / le1;
        le2 = le >> 2;
        for ( i = 0 ; i < n ; i += le )
        {
            ip    = i + le1;
            t1    = x[i];
            t3    = x[ip];
            x[i]  = t1 + t3;
            x[ip] = t1 - t3;
        }
        if ( l > 2)
        {
            ki = 0;
            kd = nv;
            for ( j = 1 ; j < le2 ; j++)
            {
                ki += k;
                kd -= k;
                u1 = fft_c[ki];
                u2 = fft_c[kd];
                for ( i = j, ir = le1 - j ; i < n ; i += le, ir += le)
                {
                    ip = i + le1;
                    is = ir + le1;
                    t1 = x[i];
                    t2 = x[ir];
      
//                    t3 = ( x[ip] * u1 - x[is] * u2 + ( 1 << 30 ) ) >> 14;
//                    t4 = ( x[is] * u1 + x[ip] * u2 + ( 1 << 30 ) ) >> 14;
//                    t3 -= 1 << ( 30 - 14 );
//                    t4 -= 1 << ( 30 - 14 );

                    t3 =( x[ip]*u1 -x[is]*u2 + ( 1<<14-1 ) ) >> (14);
                    t4 =( x[is]*u1 +x[ip]*u2 + ( 1<<14-1 ) ) >> (14);

                    x[i]  = t1 + t3;
                    x[ir] = t1 - t3;
                    x[ip] = t4 - t2;
                    x[is] = t2 + t4;
                }
            }
        }
    }
};

 

Изменено пользователем nicks1980

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

short заменить на int? Еще мысль - вычисления с сопроцессором при правильном чередовании команд хорошо распаралеливаются с пересылками и индексной арифметикой. И и вообще, целочисленных регистров много, а если к ним еще сопроцессор добавляется...

Изменено пользователем GenaSPB

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, GenaSPB сказал:

short заменить на int? Еще мысль - вычисления с сопроцессором при правильном чередовании команд хорошо распаралеливаются с пересылками и индексной арифметикой. И и вообще, целочисленных регистров много, а если к ним еще сопроцессор добавляется...

 

h - перестановки

с - это таблица cos  раздутая до 1<<14

решил все в float делать. раньше на sam7 в целых считал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...