3

我有这个代码

for (k=0; k<BUFFER_LEN; k++){                

           buffer[k] = sin(2*pi*f/fs*k);          //sine generation

我的循环每次增加 1 - 所以 k 将是 1, 2, 3, 4, 5.... 等每次计算

例如,我希望循环每次增加 0.1,所以我的正弦计算更准确?实现这一目标的最简单方法是什么?我尝试在那个 for 循环中增加 0.1,但不认为这是允许的,因为程序超时

编辑:这是一个解决方案

int i, k;
float z=0.1;

for(i = 0; i < BUFFER_LEN; i++){                         // fill the buffer
       buffer[k] = sin(2*pi*f/fs*z);                     // sine wave value generation
       z = z + 0.1;
       }
4

3 回答 3

5

如果您只想增加 0.1,则您的k值必须是浮点数。之后,就这么简单:

for(double k = 0; k < limit; k += 0.1)

但是过度使用十进制值可能会导致舍入错误,并且您的代码需要 k 是一个整数。这里也许是一个更好的解决方案:

for(int k = 0; k < limit * 10; k++){
    //Now, in your equation, use k/10.0
    buffer[k] = sin(2 * pi * f / fs * (k / 10.0));
}

确保大小buffer是所需大小的十倍!

于 2013-08-11T18:58:35.980 回答
3

简单的解决方案: 乘以您想要的增益

double gain = 0.1;
for (k=0; k<BUFFER_LEN; k++) {                
  buffer[k] = sin(gain * 2*pi*(f/fs)*k);          //sine generation
}

无需更改您的 k 循环、BUFFER_LEN 并且没有浮点问题。1/Gain 不需要是整数。


您最初的问题可能是由于:

int k;
for (k=0; k<BUFFER_LEN; k += 0.1) {                
  buffer[k] = sin(2*pi*f/fs*k);          //sine generation
}

在这种情况下,k += 0.1dok = (int) (k + 0.1) 将总和截断回原始 k。因此,您的循环将永远运行。

于 2013-08-11T19:33:53.070 回答
0

一个天真的解决方案是:

for (double k=0; k<BUFFER_LEN/10; k+=0.1){                

           buffer[10*k] = sin(2*pi*f/fs*k);

但舍入错误可能会导致错误的结果。这就是为什么你应该在循环中使用整数运算并在循环中乘以 0.1。

我会留下这个作为提醒不要做什么。

于 2013-08-11T18:56:44.340 回答