2012-01-13 2 views
2

Я вообще не знаю 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.

Спасибо!

+0

Этот код (вернее, версия этого кода, который компилируется) [отлично работает] (http://ideone.com/GlvTG). Ваша ошибка должна быть в другом месте. –

+0

Ваша программа отлично работает здесь - 'avg' выходит как' -100'. Я должен был исправить опечатку имени переменной в вашем последнем вычислении, но кроме этого это нормально. –

+0

Да, это сработало для меня, когда я использовал онлайн-компилятор, поэтому не уверен, почему он не работает на моем устройстве. Возможно, некоторая подпрограмма определяет переменные float таким образом, что не может обрабатывать очень маленькие числа. – Josiah

ответ

0

Просто понял, что проблема была: мне нужно, чтобы включить библиотеку math.h в верхней части программы:

#include <math.h> 

Без этого, я считаю, что не было никаких ссылок на функции log10, что в свою очередь привело к тому, что результатом было все 0. Теперь я включил math.h, и все работает нормально.

Смежные вопросы