我一直试图修改特定频率的幅度。这就是我所做的:
我得到数据2048为float数组,其值范围为[-1,1]。这是原始数据。
我使用此RealFFT算法http://www.lomont.org/Software/Misc/FFT/LomontFFT.html
我将原始数据分成左右声道(效果很好)。
我在左右两侧执行RealFFT(前向启用),我用这个等式找出哪个索引是我想要的正确频率:freq /(samplerate / sizeOfBuffer / 2.0)
我修改了我想要的频率。
我执行RealFFT(转发禁用)以返回频域。
现在当我回放时,我听到了我对频率所做的改变,但是有一个闪烁的噪音(当你演奏一首旧的乙烯基歌曲时有点闪烁)。
知道我可能做错了什么吗? 不久之前,我在我的大学学习了信号处理课程,所以我可能忘记了一些事情。
提前致谢!
答案 0 :(得分:2)
评论可能令人困惑。以下是一些澄清。
虚部不是阶段。实部和虚部形成一个矢量,想象一个二维图,其中实数在x轴上,虚数在y上。频率的幅度是从原点到点形成的线的长度。因此,阶段是划分的实部和虚部的arctan。幅度是实部和虚部的平方和的平方根。
因此。第一步是你想要改变矢量的大小,你必须缩放实部和虚部。
这很容易。第二部分要复杂得多。傅立叶变换"视图"世界是它无限周期 - 也就是说,看起来信号从结束回到开始。如果你在算法中加上一个完美的正弦音,并说正弦音的周期是4096个样本。进入FFT的第一个样本是+1,然后进入FFT的最后一个样本是-1。如果你看一下FFT中的频谱,就会看起来好像有很多高频,这是转换从-1到1跳跃的信号的谐波.FFT越长越近,越接近FFT显示"真实"查看信号。
通过对FFT块进行窗口化和重叠,已经开发出平滑FFT块之间转换的技术,因此块之间的转换不是这样的"不连续的"。一种相当常见的技术是使用Hann窗口并重叠4倍。也就是说,对于每2048个样本,您实际上进行4次FFT,并且每个FFT与前一个块重叠1536. Hann窗口变得很糟糕,但基本上它有很好的属性,所以你可以做这样的重叠,一切都很好地总结。
我发现这个非常有趣的博客显示了您正在经历的完全相同的学习痛苦:http://www.katjaas.nl/FFTwindow/FFTwindow&filtering.html
这种技术与另一位提到Overlap-Save的评论者不同。这是一种使用FFT进行FIR滤波的方法。然而,设计FIR滤波器通常将在Matlab / Octave等数学包中完成。
答案 1 :(得分:1)
如果使用一系列较短的FFT来修改较长的信号,那么应该对每个窗口进行零填充,以便使用更长的FFT(通过修改频谱的脉冲响应更长),并结合更长的系列通过重叠加法或重叠保存进行FFT。否则,由于循环卷积,波纹会在每次FFT / IFFT修改结束时波动,波纹会在每个窗口的开头处产生波纹,并导致您听到的周期性闪烁失真。