2011-04-02 57 views
3

FFT和改变频率和向量化for循环FFT和更改频率以及向量化FOR循环

问候所有

我可以使用FFT的组合和傅里叶级数增加和减少一个 信号的频率扩展FOR循环 下面的代码 ,但如果信号/数组要大,它变得非常慢 慢(1x44100需要大约2分钟才能完成)我确信 它必须与for循环但 我不确定如何对其进行矢量化以改善pe rformance。请注意,这将用于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循环的情节PIC只是真的很慢

enter image description here

回答

1

看来好像你基本上是向上移的信号在频域,然后你的“级数”被简单地执行关于移位诉逆DFT版为。正如你所见,天真的iDFT将会非常缓慢。尝试将整个循环转换为对ifft的调用,并且您应该能够获得巨大的加速。

+0

是的我正在使用“傅立叶级数展开”(sin/cos)做一个逆DFT。我发现对于我来说,完全理解和控制改变新信号的几乎所有方面要容易得多。我已经使用fft/ifft从时域到频域获取信号。事情是我不知道从哪里开始解决这个问题增加/减少频率和/或使用ifft调整相位。有没有人有这方面的例子? – 2011-04-02 23:56:34