Я вообще не знаю C, и я пытаюсь редактировать чей-то код, но у меня возникают проблемы при попытке конвертировать значения из журнала в линейные домены ,Преобразование из журнала в линейный в C и среднее значение
Например, предположим, что у нас есть массив A, который полон значений бревенчатых равна -100 дБ, т.е.
float A[100];
int i;
for(i=0; i<100; i++)
A[i] = -100;
То, что я хочу сделать, это найти среднее значение всех значений (которые явно -100), но усреднение в линейном и не войти домен, т.е.
float tmp_avg = 0.0;
float avg;
int count = 0;
for(i=0; i<100; i++) {
tmp_avg += pow(10.0, A[i]/10.0);
count++;
}
avg = 10*log10(tmp_avg/count);
Однако результат я получаю все 0. Теперь код, над которым я работаю, намного сложнее, чем это, но мне было интересно, есть ли что-то очевидное, что мне не хватает, почему это не сработает.
Я думал, что 10^(- 100/10) является очень маленьким значением (1е-10) и, возможно, слишком мал, чтобы точно определить как поплавок. Я попытался сделать его двойным вместо, но я все еще получаю результат всех 0.
Спасибо!
Этот код (вернее, версия этого кода, который компилируется) [отлично работает] (http://ideone.com/GlvTG). Ваша ошибка должна быть в другом месте. –
Ваша программа отлично работает здесь - 'avg' выходит как' -100'. Я должен был исправить опечатку имени переменной в вашем последнем вычислении, но кроме этого это нормально. –
Да, это сработало для меня, когда я использовал онлайн-компилятор, поэтому не уверен, почему он не работает на моем устройстве. Возможно, некоторая подпрограмма определяет переменные float таким образом, что не может обрабатывать очень маленькие числа. – Josiah