gpt4 book ai didi

c++ - "Garbled"在 VST 插件中使用 FFTW 的声音

转载 作者:行者123 更新时间:2023-11-27 22:49:09 31 4
gpt4 key购买 nike

我对信号处理还是很陌生,我想创建一种使用 FFTW 的示例 VST 插件(因为我在 Rosetta Code 上发现的 FFT 和 IFFT 似乎工作得太慢)除了 (无用)对每个输入样本应用 FFT,然后对结果应用 IFFT。目标是恢复原始声音,但输出似乎(因为缺乏描述声音质量的更好术语的知识)“乱码”。以下是 processReplacing 函数的代码:

void VST_Testing::VST_Testing::processReplacing(float **inputs, float **outputs, VstInt32 sampleFrames) {
resume();
time = 0;
float *in1 = inputs[0];
float *in2 = inputs[1];
float *out1 = outputs[0]; //L
float *out2 = outputs[1]; //R
float *out3 = outputs[2]; //C
float *out4 = outputs[3]; //RL
float *out5 = outputs[4]; //RR
VstInt32 initialFrames = sampleFrames;
fftw_complex* left = (fftw_complex*)fftw_malloc(sizeof(fftw_complex)*sampleFrames);
fftw_complex* right = (fftw_complex*)fftw_malloc(sizeof(fftw_complex)*sampleFrames);
int i = 0;
while (--sampleFrames >= 0)
{
left[i][0] = *in1++;
left[i][1] = 0;
right[i][0] = *in2++;
left[i][1] = 0;
i++;
}
sampleFrames = initialFrames;

fftw_complex* l_out = (fftw_complex*)fftw_malloc(sizeof(fftw_complex)*sampleFrames);
fftw_complex* r_out = (fftw_complex*)fftw_malloc(sizeof(fftw_complex)*sampleFrames);

fftw_plan p_l = fftw_plan_dft_1d(sampleFrames, left, l_out, FFTW_FORWARD, FFTW_MEASURE);
fftw_plan p_r = fftw_plan_dft_1d(sampleFrames, right, r_out, FFTW_FORWARD, FFTW_MEASURE);

fftw_execute(p_l);
fftw_execute(p_r);

fftw_destroy_plan(p_l);
fftw_destroy_plan(p_r);

p_l = fftw_plan_dft_1d(sampleFrames, l_out, left, FFTW_BACKWARD, FFTW_MEASURE);
p_r = fftw_plan_dft_1d(sampleFrames, r_out, right, FFTW_BACKWARD, FFTW_MEASURE);

fftw_execute(p_l);
fftw_execute(p_r);
i = 0;
while (--sampleFrames >= 0)
{
(*out3++) = 0.5*left[i][0] + 0.5*right[i][0];
(*out4++) = left[i][0];
(*out5++) = right[i][0];
i++;
}

fftw_destroy_plan(p_l);
fftw_destroy_plan(p_r);

fftw_free(left);
fftw_free(right);
fftw_free(l_out);
fftw_free(r_out);
}
}

我的期望是我会从 in1in2(预期使用中的左右输入)输入回来的信号几乎完全相同 out4out5(预期使用中的左后和右后输出)。是我在代码中犯了错误,还是我对 FFTW 行为的预期不正确?

最佳答案

除了复制和粘贴错误之外,问题显然是由 FFTW 计算非规范化变换这一事实引起的。来自“What FFTW really computes”,

FFTW computes an unnormalized transform, in that there is no coefficient in front of the summation in the DFT. In other words, applying the forward and then the backward transform will multiply the input by n.

这个问题的解决方案是将信号除以 initialFrames 以便归一化:

while (--sampleFrames >= 0)
{
(*out3++) = 0.5*(left[i][0]/initialFrames) + 0.5*(right[i][0]/initialFrames);
(*out4++) = left[i][0]/initialFrames;
(*out5++) = right[i][0]/initialFrames;
i++;
}

关于c++ - "Garbled"在 VST 插件中使用 FFTW 的声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39422564/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com