我有这段代码
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;
}
答案 0 :(得分:5)
如果您想要做的只是递增.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
的大小是其所需的十倍!
答案 1 :(得分: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&amp;没有浮点问题。 1 /增益不需要是整数。
你原来的问题可能是由于:
int k;
for (k=0; k<BUFFER_LEN; k += 0.1) {
buffer[k] = sin(2*pi*f/fs*k); //sine generation
}
在这种情况下,k += 0.1
执行k = (int) (k + 0.1)
会将总和截断回原始k。因此,你的循环将永远运行。
答案 2 :(得分:0)
一个天真的解决方案是:
for (double k=0; k<BUFFER_LEN/10; k+=0.1){
buffer[10*k] = sin(2*pi*f/fs*k);
但舍入错误可能会导致错误的结果。这就是为什么你应该在循环中使用整数运算并在循环中乘以0.1。
我会留下这个提醒不要做的事。