FFT 和改变频率并矢量化 FOR 循环

Posted

技术标签:

【中文标题】FFT 和改变频率并矢量化 FOR 循环【英文标题】:FFT and changing frequency and vectorizing a FOR loop 【发布时间】:2011-04-02 22:09:19 【问题描述】:

FFT 和改变频率以及循环矢量化

大家好

我可以增加和减少 使用 fft 和傅里叶级数展开 FOR 循环的组合的信号 下面的代码 但是如果信号/阵列太大,它会变得非常 慢(1x44100 的数组大约需要 2 分钟才能完成)我确定 它与 for 循环有关,但 我不确定如何对其进行矢量化以提高性能。请注意,这将用于 3 到 6 分钟长的音频信号。 1x44100数组只需一秒,大约需要2分钟完成

任何建议

%create signal
clear all, clc,clf,tic
x= linspace(0,2*pi,44100)';

%Used in exporting to ycalc audio file make sure in sync with above
freq_orig=1;
freq_new=4
vertoff=0;
vertoffConj=0;
vertoffInv=0;
vertoffInvConj=0;
phaseshift=(0)*pi/180 ; %can use mod to limit to 180 degrees

y=sin(freq_orig*(x));
[size_r,size_c]=size(y);

N=size_r; %to test make 50
T=2*pi;
dt=T/N;
t=linspace(0,T-dt,N)';
phase = 0;
f0 = 1/T; % Exactly, one period

y=(y/max(abs(y))*.8)/2; %make the max amplitude here
C = fft(y)/N; % No semicolon to display output


A = real(C);
B = imag(C)*-1; %I needed to multiply by -1 to get the correct sign

% Single-Sided (f >= 0)
An = [A(1); 2*A(2:round(N/2)); A(round(N/2)+1)]; 
Bn = [B(1); 2*B(2:round(N/2)); B(round(N/2)+1)];

pmax=N/2;
ycalc=zeros(N,1); %preallocating space for ycalc
w=0;

for p=2:pmax
               %
       %%1 step) re-create signal using equation
        ycalc=ycalc+An(p)*cos(freq_new*(p-1).*t-phaseshift)
+Bn(p)*sin(freq_new*(p-1).*t-phaseshift)+(vertoff/pmax);
        w=w+(360/(pmax-1)); %used to create phaseshift
        phaseshift=w;

end;

fprintf('\n- Completed in %4.4fsec or %4.4fmins\n',toc,toc/60);

subplot(2,1,1), plot(y),title('Orginal Signal');
subplot(2,1,2),plot(ycalc),title('FFT new signal');

如果有人想查看输出,这是情节的图片,这是正确的,FOR 循环真的很慢

【问题讨论】:

【参考方案1】:

看起来好像您基本上是在频域中向上移动信号,然后您的“级数扩展”只是在移位版本上实现逆 DFT。如您所见,幼稚的 iDFT 将非常缓慢。尝试将整个循环更改为对 ifft 的调用,您应该能够获得巨大的加速。

【讨论】:

是的,我正在使用“傅里叶级数展开”(sin/cos)来进行逆 DFT。我发现对我来说,完全理解和控制改变新信号的几乎所有方面要容易得多。我使用 fft/ifft 将信号从时域转换到频域。问题是我不确定从哪里开始解决这个问题,增加/减少频率和/或使用 ifft 调整相位。有人有这方面的例子吗?

以上是关于FFT 和改变频率并矢量化 FOR 循环的主要内容,如果未能解决你的问题,请参考以下文章

在进行 FFT 和改变频率分量值之后,我只会在音频中得到噪音。我哪里错了?

如何正确 FFT 声音阵列?

用2个变量和1个相关值插值矩阵

悬赏,请大家帮忙,MATLAB怎么用,改变声音频率(电脑软件)

NSRange 在 for 循环中改变自身

动态变量名称以在 for 循环中改变变量