延迟输出 0
Delay outputting 0's
有人可以告诉我这里出了什么问题吗? 延迟有一个带有指针 *p 的缓冲区 (del),但每个样本输出零 (0)。
(固定延迟3秒)
float delay(float *sig, float dtime, float *del, int *p, int vecsize, float sr) {
int dt;
float out;
dt = (int) (dtime*sr);// dtime = 3secs, sr=44100.0
for(int i=0; i<vecsize; i++){
out = del[*p];
del[*p] = sig[i];
sig[i] = out;
*p = (*p != dt-1 ? *p+1 : 0);
}
return *sig;
}
您的delay()
函数似乎工作正常,因此错误一定出在您调用它的方式上。 请参阅以下示例程序:
#include <stdio.h>
float delay(float *sig, float dtime, float *del, int *p, int vecsize, float sr)
{
int dt;
float out;
dt = (int) (dtime*sr);// dtime = 3secs, sr=44100.0
for(int i=0; i<vecsize; i++){
out = del[*p];
del[*p] = sig[i];
sig[i] = out;
*p = (*p != dt-1 ? *p+1 : 0);
}
return *sig;
}
#define DTIME 3
#define SAMPLERATE 44100
#define VECSIZE (10 * SAMPLERATE)
int main()
{
float del[DTIME * SAMPLERATE] = { 0.0 };
int del_p = 0;
float sig[VECSIZE] = { -5.0, -4.0, -3.0, -2.0, -1.0, 0.0, 1.0, 2.0, 3.0, 4.0, 5.0 };
int i, j;
delay(sig, DTIME, del, &del_p, VECSIZE, SAMPLERATE);
for (i = 0; i < VECSIZE && sig[i] == 0.0; i++)
;
for (j = i; j < VECSIZE && j < i + 10; j++)
printf("sig[%d] = %fn", j, sig[j]);
return 0;
}
生成的输出符合预期:
sig[132300] = -5.000000
sig[132301] = -4.000000
sig[132302] = -3.000000
sig[132303] = -2.000000
sig[132304] = -1.000000
sig[132305] = 0.000000
sig[132306] = 1.000000
sig[132307] = 2.000000
sig[132308] = 3.000000
sig[132309] = 4.000000
请注意,您实际上应该将dt
直接传递给 delay()
函数,而不是根据 sr
和 dtime
计算它 - 就 delay()
函数而言,重要的是样本数量的延迟(因此del[]
延迟线数组的假定大小)。 无论如何,您必须在调用方中计算该值,以适当调整del[]
数组的大小。
你总是*sig
回来。 这始终是sig
数组的第一个元素。 sig[0]
等于del[*p]
,因为您是第一次通过循环(当i=0
时)执行以下操作:
out = del[*p];
del[*p] = sig[0]; // doesn't affect sig
sig[0] = out;
这是sig[0]
唯一一次受到影响。 然后当你回来时*sig
你回来sig[0]
.
所以我希望这个函数总是返回del[*p]
是什么。
相关文章:
- 递归函数计算序列中的平方和(并输出过程)
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 请解释"函数1(p1,p2,p3);"的输出
- C++:将控制台输出存储在宏中更好吗
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 如何仅为一个函数添加延迟
- 为什么我的代码在输出中增加了93天
- 如何从void函数输出字符串
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- AES加密到解密未正确输出
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 如何将 Openh264 解码帧无延迟输出格式转换为 OpenCV 矩阵
- 为什么MP3解码的输出听起来如此延迟?(使用FFMPEG mp3lame lib)
- 如何在C++中延迟输出
- linux上c++中的延迟输出
- 具有时间延迟的简单输入输出
- 延迟输出 0