реклама на сайте
подробности

 
 
> Отрицательный float превращается в 0
Haamu
сообщение Dec 16 2013, 10:17
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 90
Регистрация: 12-12-13
Пользователь №: 79 587



Контролеер STM32F4, среда CoIDE, включен HARD FPU.
Есть такая вот структура:
Код
typedef struct{
   char Mode;
   uint16_t Amplitude;   //4095
   uint16_t Freqency;
   uint16_t Discreteness;  //10000
   uint8_t Periods;
   uint8_t   Waveform;
   float Attenuation;   //1
   int16_t SignalData[10000];
}ModeStructTypeDef;

Тут заполняется массив SignalData[]:
Код
for (i = 0; i < ModeStruct->Discreteness; i++)
      {
         ModeStruct->SignalData[i] = (int16_t)roundf((sinf(M_TWOPI * i / 10000) * (ModeStruct->Amplitude / 2)));
      }

Тут провожу некоторые вычисления и после этого выдаю данные на ЦАП:
Код
uint16_t data = ((uint16_t)roundf((float)ModeStruct.SignalData[step_counter] / ModeStruct.Attenuation)) + (ModeStruct.Amplitude / 2);

Проблема следующая... Как видно из кода, он генерирует синусоиду с нужными мне параметрами на выходе ЦАП. При заполнении массива проблем не возникает, заполняется числами, соответствующими синусоиде с амплитудой от -2047 до 2047. А вот при дальнейшей обработке есть проблема: с положительной полуволной всё нормально (умножается на коэффициэнт затухания, увеличивается на 2047), а вот в отрицательной полуволне все значения = 2047, то есть где-то здесь ((uint16_t)roundf((float)ModeStruct.SignalData[step_counter] / ModeStruct.Attenuation)) отрицательные значения превращаются в 0. Подскажите пожалуйста, что я делаю не так.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Xenia
сообщение Dec 16 2013, 11:46
Сообщение #2


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(Haamu @ Dec 16 2013, 14:17) *
При заполнении массива проблем не возникает, заполняется числами, соответствующими синусоиде с амплитудой от -2047 до 2047. А вот при дальнейшей обработке есть проблема: с положительной полуволной всё нормально (умножается на коэффициэнт затухания, увеличивается на 2047), а вот в отрицательной полуволне все значения = 2047, то есть где-то здесь ((uint16_t)roundf((float)ModeStruct.SignalData[step_counter] / ModeStruct.Attenuation)) отрицательные значения превращаются в 0. Подскажите пожалуйста, что я делаю не так.


Так у вас же
uint16_t data
беззнаковая, как вы в ней хотите отрицательние числа увидеть?
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd August 2025 - 16:13
Рейтинг@Mail.ru


Страница сгенерированна за 0.01378 секунд с 7
ELECTRONIX ©2004-2016