【问题标题】:Delay outputting 0's延迟输出 0
【发布时间】:2011-05-19 01:49:59
【问题描述】:

谁能告诉我这里出了什么问题。 delay 有一个带有指针 *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;
}

【问题讨论】:

  • 其实我相信你会返回del[*p]delp 都超出了我们的范围,因此您可能需要发布更多代码/解释您想要实现的目标。
  • 我正在尝试在音频上创建延迟效果,即 *sig。是的,两者都是外部分配的。
  • 酷,但这并没有真正的帮助。你可以在循环之前打印 del[*p] 吗?

标签: c++ c signal-processing


【解决方案1】:

您的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] = %f\n", j, sig[j]);

    return 0;
}

output produced 符合预期:

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() 函数,而不是从srdtime 计算它 - 就delay() 函数而言,这是数量上的延迟重要的样本(以及 del[] 延迟线阵列的假定大小)。无论如何,您都必须在调用者中计算该值,才能适当地调整 del[] 数组的大小。

【讨论】:

  • 谢谢大家。 @caf 好的,我会尝试直接传递 dt 。我认为这就是我所说的导致问题的原因。我只是想真正确保 delay() 函数正常工作。非常感谢。
【解决方案2】:

您总是返回*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] 是什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-27
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多