Логика сравнения с целыми числами со знаком и шумом, дающая неожиданные результатыC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Логика сравнения с целыми числами со знаком и шумом, дающая неожиданные результаты

Сообщение Anonymous »

Я работаю над декодером кода Морзе для Arduino, который интерпретирует длительность (положительную/отрицательную для включения/выключения тона) в точки, тире и пробелы. Я добавляю случайный шум для имитации реального отклонения сигнала, но моя логика сравнения не может правильно классифицировать длительности — часто печатает «промах», даже если длительности должны соответствовать ожидаемым диапазонам.
Я изменил самые короткие длительности на абс(durations) вместо без и скорректировал шум так, чтобы максимальное значение было равно 1. Но это не добавляет пробелов
const int abcLength = 19;
int abcDurations[abcLength] = {420,-420,1260,-2940,1260,-420,420,-420,420,-420,420,-2940,1260,-420,420,-420,1260,-420,420};

void setup() {
Serial.begin(9600);
Serial.println("");
randomSeed(analogRead(0));
duration2morse(abcDurations,abcLength);
}

String duration2morse(int* durations, int length) {
const float Variability = 0.1;
int shortestDuration = 20000;
addNoise(durations, length, Variability);
for(int i=0; i < length; i++) {
if(abs(durations) < shortestDuration) {
shortestDuration = abs(durations);
}
}
for(int i=0; i < length; i++) {
if(durations > shortestDuration * (1 - Variability) && durations < shortestDuration * (1 + Variability)) {
Serial.print(".");
} else if(durations > shortestDuration * (3 - Variability) && durations < shortestDuration * (3 + Variability)) {
Serial.print("-");
} else if(abs(durations) > shortestDuration * (3 - Variability) && abs(durations) < shortestDuration * (3 + Variability)) {
Serial.print("/");
} else if(abs(durations) > shortestDuration * (7 - Variability) && abs(durations[i]) < shortestDuration * (7 + Variability)) {
Serial.print(" ");
} else {
Serial.println("miss");
}
}
}

void addNoise(int* array, int length, float fraction) {
for(int i=0; i < length; i++) {
long variability = random(fraction * 100);
long plusMinus = random(0,2);
if(plusMinus == 0) {
array[i] = array[i] + variability ;
} else if(plusMinus == 1) {
array[i] = array[i] - variability;
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/798 ... ed-outputs
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»