在 VST 插件中使用 FFTW "Garbled"声音
"Garbled" sound using FFTW in VST Plugin
我对信号处理仍然很陌生,我想使用FFTW创建一种示例VST插件(因为我在Rosetta代码上发现的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);
}
}
我的期望是,我将从in1
和in2
(预期使用中的左和右输入)获得几乎相同的信号,输入out4
和out5
(预期使用中的左后和右后输出)。是我在代码中犯了错误,还是我对FFTW行为的期望不正确?
除了复制-粘贴错误之外,这个问题显然是由FFTW计算非规范化转换这一事实引起的。选自《FFTW到底算什么》
FFTW计算的是一个非归一化变换,因为在DFT中求和前没有系数。换句话说,应用前向变换和后向变换将使输入乘以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++;
}
来自FFTW参考:
FFTW_MEASURE告诉FFTW通过实际计算几个fft并测量它们的执行时间来找到一个优化的计划。根据您的机器,这可能需要一些时间(通常是几秒钟)。
这建议您可能应该提前运行此例程,然后使用它生成的计划,而不是在每个循环中重新创建它们。当然,这需要固定大小的框架,但无论如何,您迟早会遇到这个问题。
可能不是您唯一的问题,但这里有一个复制粘贴错误:
while (--sampleFrames >= 0)
{
left[i][0] = *in1++;
left[i][1] = 0;
right[i][0] = *in2++;
left[i][1] = 0; // <<< should be right[i][1] = 0;
i++;
}
相关文章:
- 在 Mac 上使用 CMAKE 将 FFTW 和 FFTWPP 链接到项目中时未定义的符号
- 有没有办法在一个C++程序中同时使用 FFTW 和 cuFFTW?
- 如何使用FFTW库C++计算3D阵列的FFT?
- fftw:为什么我的 2D DFT 输出与每行的 1D DFT 输出不同?
- 如何在C++中正确使用带有向量的FFTW
- 在windows上使用cmake编译FFTW(OpenMP)
- 如何使用CMAKE将FFTW添加到Android项目中
- 使用 fftw 的图像中间的 DC 组件
- 如何在CMAKE中使用FFTW库
- 我没有从使用 FFTW 的重叠添加 FFT 卷积中获得预期结果
- C++代码在使用 fftw 库时无法运行
- FFT and FFTShift of matlab in FFTW library c++
- FFTW 的功率谱不起作用,但在 MATLAB 中确实如此
- 执行FFT计划后,FFTW输出矢量大小错误
- 自定义3D(并行)FFTW变换
- FFTW和OpenCV的C++接口,Mat输出中的实部和虚部
- 使用 FFTW 和 OpenCV 的 FFT 可视化
- 如何在我的项目中使用fftw dll导入库.lib作为静态.lib
- FFTW 3.3.3实际数据的基本用法
- 在 VST 插件中使用 FFTW "Garbled"声音