作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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 循环真的很慢
最佳答案
看起来好像您基本上是在频域中向上移动信号,然后您的“级数扩展”只是在移动版本上实现逆 DFT。正如您所看到的,简单的 iDFT 将会非常慢。尝试将整个循环更改为对 ifft 的调用,您应该能够获得巨大的加速。
关于matlab - FFT 和改变频率以及矢量化 FOR 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5526226/
我是一名优秀的程序员,十分优秀!