0

可能重复:
C编程部门

我正在尝试将值转换为 Mel 过滤器,但是,每次输出结果时,它始终为“0”,即使它是双精度值。它应该是一个浮点数吗?这是一篇关于等式的文章:http ://en.wikipedia.org/wiki/Mel_scale

这是功能:

double MFCC::mel_filter(int val)
{
     double tmp;
     tmp = 2595 * log10(1 + val / 700);
     cout << tmp << endl;
     return tmp;
    }

    vector<double> MFCC::mel_frame(int size)
    {
    vector<double> mel_Frame;
    for(int i=1; (i < size); i++)
    {
          this->mel_filter(i);
    }

    return mel_Frame;
    }

在main中,我将传递诸如.. (1, 2, 3, 4, 5, 6, 7 ......)之类的值

如果输入“1”,则等式为:

m = 2595 * log10(1 + 1 / 700) = 1.6

有什么帮助或建议吗?

4

4 回答 4

5

你的问题在

log10(1 + val / 700)

那是使用整数除法而不是实际除法。尝试

log10(1 + val / 700.0)
于 2012-12-04T20:55:14.200 回答
3

的类型val是 int。所以表达式val / 700是用整数算术计算的。结果为零。

于 2012-12-04T20:55:14.883 回答
2

当您使用整数文字时,将使用整数算术。这意味着任何小数都将四舍五入。将常量显式写为十进制数,将使用双精度算术:

tmp = 2595.0 * log10(1.0 + val / 700.0);
于 2012-12-04T20:55:36.967 回答
2

尝试

log10(1 + val / (float) 700)
于 2012-12-05T01:43:47.890 回答