科学网

 找回密码
  注册

tag 标签: 谱分析

相关帖子

版块 作者 回复/查看 最后发表

没有相关内容

相关日志

[转载]【MATLAB】谱分析自学课程(5)-2-D spectral analysis
JerryYe 2018-1-29 16:30
Two-dimensional spectral analysis Contents Make a synthesized 2-D signal Lets take the powerspectrum in x and look at it... Taking the 2-D Power Spectrum.... A more interesting process. Do the 2-D spectral estimate... Make a synthesized 2-D signal Here, let $ and $ be the space the data occupies, and $ be the signal. xx = 1:1000; yy = 1:2000; =meshgrid(xx,yy); kx0 = 0.01; ky0 = 0.004; w = cos(x*2*pi*kx0).*cos(y*2*pi*ky0); figure(1);clf imagesc(xx,yy,w); set(gca, 'ydir' , 'no' ); xlabel( 'x ' ); ylabel( 'y ' ); Lets take the powerspectrum in x and look at it... % first k_x = /\\deltax M = length(xx); N = length(yy); dx = 1; k_x = (0:M-1)/dx/M; dy = 1; k_y = (0:N-1)/dx/N; X = fft(w\')\'; Gx = (1/M/dx)*X(:,2:M/2).* conj(X(:,2:M/2)); k_x = k_x(2:M/2); The spectrum of any individual row is just the spectrum of w at that value of y: For this example, it is just a spike at $. figure(2);clf loglog(k_x,Gx(10,:)) xlabel( 'k_x ' ); ylabel( 'G_x(k_x: y=10 m)' ); The value of this peak varies with y as $. in = find(k_xkx0); in = in(1)-1; figure(3); clf; plot(y,Gx(:,in)); xlabel( 'y ' ); ylabel( 'G_x(k_x=k_{x0},y)' ); or visualized in 2-D.... figure(4); pcolor(k_x,yy,real(Gx));shading flat ; set(gca, 'xscale' , 'log' ); xlabel( 'k_x ' ); ylabel( 'y ' ); Taking the 2-D Power Spectrum.... XY = fft(fft(w\')\'); k_x = (0:M-1)/dx/M; k_y = (0:N-1)/dx/N; GXY = (1/M/dx)*(1/N/dy)*XY(2:N/2,2:M/2).* conj(XY(2:N/2,2:M/2)); k_y = k_y(2:N/2); k_x = k_x(2:M/2); We see the result is a single peak at $ figure(5);clf subplot(1,2,1); pcolor(k_x,k_y,real(GXY));shading flat ; set(gca, 'xscale' , 'log' , 'yscale' , 'log' ) xlabel( 'k_x ' ); ylabel( 'k_y ' ); subplot(1,2,2); surface(k_x,k_y,real(GXY));shading interp ; set(gca, 'xscale' , 'log' , 'yscale' , 'log' ) xlabel( 'k_x ' ); ylabel( 'k_y ' ); view(30,30); w0 = w; A more interesting process. Consider a 2-D white noise process, and then integrate separately in both x and y to get red processes in both dimensions.. Then ad the noise back on... wp = randn(N,M); w = cumsum(cumsum(wp)\')\'; w = w+wp*50+1000*w0; figure(10);clf subplot(2,1,1); imagesc(xx,yy,wp); set(gca, 'ydir' , 'nor' ); title( 'w''' ); ylabel( 'y ' ); subplot(2,1,2); imagesc(xx,yy,w); title( 'w' ); set(gca, 'ydir' , 'nor' ); xlabel( 'x ' ); Do the 2-D spectral estimate... XY = fft(fft(w\')\'); k_x = (0:M-1)/dx/M; k_y = (0:N-1)/dx/N; GXY = (1/M/dx)*(1/N/dy)*XY(2:N/2,2:M/2).* conj(XY(2:N/2,2:M/2)); k_y = k_y(2:N/2); k_x = k_x(2:M/2); Note how the spectrum has large amlitude at low wavenumbers, and then hits a noise floor at high wavenumbers. figure(15);clf subplot(1,2,1); pcolor(k_x,k_y,log10(real(GXY)));shading flat ; set(gca, 'xscale' , 'log' , 'yscale' , 'log' ) xlabel( 'k_x ' ); ylabel( 'k_y ' ); subplot(1,2,2); surface(k_x,k_y,log10(real(GXY)));shading interp ; set(gca, 'xscale' , 'log' , 'yscale' , 'log' ) xlabel( 'k_x ' ); ylabel( 'k_y ' ); view(40,20); Published with MATLAB® 7.7 原文请访问: http://valdez.seos.uvic.ca/~jklymak/Phy580/html/Fft2d.html
个人分类: Matlab|1675 次阅读|0 个评论
[转载]【MATLAB】谱分析自学课程(3)-Drawbacks of spectral analysis
JerryYe 2018-1-29 16:27
Problems w/ power spectra? Contents Getting started Aliasing Finite record length Spectral Leakage: Next Getting started load SynthSig ; Aliasing Here we need to generate another peak. om_peak= 4.4*2*pi; ph = rand(1,1)*2*pi; sig.x_peak2 = 2*10.*cos(om_peak*sig.t+ph)/10; =rawPowerSpec(sig.x_peak2+sig.x_peak+sig.x_w,dt); % Now, suppose that we can only sample at 0.25 Hz (i.e. 1/4 of the time) xx = sig.x_peak2+sig.x_peak+sig.x_w; x=xx(1:4:end); t = sig.t(1:4:end); =rawPowerSpec(x,median(diff(t))); jmkfigure(100,2,0.6);clf subplot(2,1,1); plot(x(1:100)); hold on ; plot(1:4:100,x(1:4:100), 'b.' , 'markersi' ,10); xlabel( 't ' ); ylabel( 'x ' ); subplot(2,1,2); loglog(f,p,fn,pn) axis tight ; yl = get(gca, 'ylim' ); xlabel( 'f ' ); ylabel( '\\phi_x ' ); axis tight print -dpng -r250 doc/Aliasing here we see the result of aliasing , where the peak has wrapped around to a harmonic in the resolved spectrum. To stop this we should smooth the new signal first: =butter(2,0.3); x = filtfilt(b,a,xx); subplot(2,1,1); plot(1:4:100,x(1:4:100), 'r.' , 'markersize' ,10) plot(x(1:100), 'g' ) xlabel( 't ' ); ylabel( 'x ' ); =rawPowerSpec(x,median(diff(sig.t))); x = x(1:4:end); t = sig.t(1:4:end); =rawPowerSpec(x,median(diff(t))); subplot(2,1,2); loglog(f,p,fn,pn,fnp,pnp,fnn,pnn) set(gca, 'ylim' ,yl); xlabel( 'f ' ); ylabel( '\\phi_x ' ); axis tight print -dpng -r250 doc/AliasingFixed Finite record length The last foible is finite record length. The difference between frequency bins is df = 1/T where T is the length of the record. Shorter records, the longer df . To see the effect make a second peak very close to the first, but far enough apart that they can be distinguished in the full time-series. om = th.f*2*pi; om_peak = find(om0.4*2*pi); f0=om(om_peak(1))/2/pi; om_peak=om(om_peak(1)+3); % chose a peak 4 bins higher. ff = om_peak/2/pi; 1./abs(ff-f0) ph = rand(1,1)*2*pi; sig.x_peak2 = A_peak.*cos(om_peak*sig.t+ph)/10; x = sig.x_peak2+sig.x_peak+sig.x_w; jmkfigure(3,2,0.7);clf subplot(3,1,1); plot(x); hold on ; plot(x(1:1500), 'b' ); plot(x(1:1000), 'r' ); ylabel( 'x ' ); subplot(3,1, ); sty = { 'k-' , 'b-' , 'r-' }; N = length(x); for i=1:3; =rawPowerSpec(x(1:N-0.35*N*(i-1)),dt); loglog(f,p,sty{i}); hold on ; h(i)=loglog(f,p, 'o' , 'markersi' ,6, 'col' ,sty{i}(1)); set(gca, 'xlim' , ); df(i)=median(diff(f)); nn(i) = length(x(1:N-0.25*N*(i-1))); str{i}=sprintf( 'N=%d; \\\\Delta f=%1.2e ' ,nn(i),df(i)); end ; xlabel( 'f ' ); ylabel( '\\phi_x ' ); legend(h(1:3),str{1:3}) title(sprintf( 'Peaks separated by \\\\Delta f=%1.2e' ,abs(ff-f0))); print -dpng -r400 doc/FiniteRecord.jpg ans = 66.6667 Here it is clear that fewer data points means poorer peak resolution. Once df rises above the peak separation they merge. A trick to get better frequency resolution is to zero-pad the data. However, in this case, even if we do this, we do not improve resolution between the peaks, just the centering of the peaks. jmkfigure(4,2,0.6);clf sty = { 'k-' , 'b-' , 'r-' }; N = length(x); for i=1:3; subplot3(1,3,i, 'xscale' , 'log' , 'yscale' , 'log' ); =rawPowerSpec(x(1:N-0.35*N*(i-1)),dt); loglog(f,p,sty{i}); xx = x(1:N-0.35*N*(i-1)); xxx = zeros(1,floor(5*N)); xxx(1:length(xx)) =xx; =rawPowerSpec(xxx,dt); h(i)=loglog(ff,pp,sty{i}); hold on ; h(i)=loglog(f,p,sty{i}); hold on ; % h(i)=loglog(f,p,'o','markersi',6,'col',sty{i}(1)); set(gca, 'xlim' , ); df(i)=median(diff(f)); nn(i) = length(x(1:N-0.25*N*(i-1))); str{i}=sprintf( 'N=%d' ,nn(i)); if i==1 ylabel( '\\phi_x ' ); end ; end ; %legend(h(1:3),str{1:3}) title( 'Zero-padded data' ); xlabel( 'f ' ); print -dpng -r400 doc/ZeroPad.jpg Note in this example how the poorly-resolved peaks (blue) have better peak localization than if we don't zero pad. However, this doesn't help separate peaks that aren't resolved in the unpadded timeseries. Spectral Leakage: Compute a raw fft of a strong peak with white noise. Note that we have put the steps from the previous tutorial into a function. dt = median(diff(sig.t)) =rawPowerSpec(sig.x_peak*10,dt); =rawPowerSpec(sig.x_w,dt); =rawPowerSpec(sig.x_peak*10+sig.x_w,dt); figure(1);clf semilogy(f,p,f,p_w,f,p_p); dt = 0.1000 Next Next we consider ways to reduce smearing of peaks in the spectra and ways to improve the signal-to-noise of spectral extimates. Published with MATLAB® 7.7 原文请访问:http://valdez.seos.uvic.ca/~jklymak/Phy580/html/FftFoibles.html
个人分类: Matlab|1086 次阅读|0 个评论
[转载]【MATLAB】谱分析自学课程(1)-傅里叶分析
JerryYe 2018-1-29 16:08
FFT first tutorial.. Contents Introduction Synthesized data Theoretical power spectra Introduction This tutorial deals with Fourier analysis and its use in interpreting data. The reader is assumed to be familiar with Fourier transforms, but not necessarily with their use in data characterization. Synthesized data Here we create a synthetic data set consisting of a red signal, an isolated peak, and white noise. First, the time axis is determined. Note this could be a spatial axis as well. This data has a sampling frequency of dt . We could use dt=1 , but this lends considerable confusion later when determining the amplitude of the spectrum. dt = 0.1; % seconds t = (0:2000)*0.1; We will have data with frequencies of 1/dt/2 to 1/1000; Note that we keep track of units as factors of 2*pi can easily be lost when dealing with the frequency domain. dom = 1/200; om = dom:dom:1/dt/2; % this is cycles/s=Hz. om = 2*pi*om; % this is rad/s. set the relative amplitudes: A_w = 0.3; A_r = 1; A_peak = 22; om_peak = find(om0.4*2*pi); % make sure it is not dead on a peak om_peak=om(om_peak(1))+0.3*median(diff(om)); White noise is a Gaussian process... x_w = A_w*randn(1,length(t)); figure(1); subplot(4,1,1); plot(t,x_w, 'col' , *0.5); A Red signal is the integral of a Gaussian process. %A = repmat(A_r*(1+0.9*randn(length(om),1)).*om'.^(-1),1,length(t)); %ph = repmat(rand(length(om),1)*2*pi,1,length(t)); %x_r = sum(A.*cos(om'*t+ph))*sqrt(dom); x_r = cumsum(randn(1,length(t)))*median(diff(t)); subplot(4,1,2); plot(t,x_r, 'r' ); A peak ph = rand(1,1)*2*pi; x_peak = A_peak.*cos(om_peak*t+ph)*sqrt(dom); subplot(4,1,3); plot(t,x_peak, 'b' ); Combine... x=x_peak+x_r+x_w; subplot(4,1,4); plot(t,x); set(datachildren(gcf), 'ylim' , *10); ylabel( 'x ' ); Theoretical power spectra The three wave forms plotted above have known power spectra. f = om/2/pi; df = median(diff(f)); % it is usual to plot spectra in terms of cycles/s. P_w = om*0+var(x_w)/max(f); P_r = f.^(-2); P_r = P_r./sum(P_r*df)*var(x_r); P_peak = om*0; in = find(om=om_peak);in =in(1) P_peak(in) = 1*var(x_peak)/df; % rename so we don't overwrite by accident. th.f=f; th.P_r=P_r; th.P_w=P_w; th.P_peak=P_peak; th.Px = th.P_r+th.P_w+th.P_peak; % sig.t =t; sig.x_w = x_w; sig.x_r = x_r; sig.x_peak = x_peak; sig.x = x; jmkfigure(2,2,0.4);clf loglog(th.f,th.P_w, 'col' , *0.5); hold on ; loglog(th.f,th.P_r, 'r' ); loglog(th.f,th.P_peak, 'bx' , 'markersi' ,10); loglog(th.f,th.Px, 'k' ); xlabel( 'f ' ); ylabel( 'P_x ' ); legend( 'x_w' , 'x_r' , 'x_{peak}' , 'Sum' ); title( 'Theoretical spectrum of synthetic signals' ); in = 82 The plot shown above is the ideal we are striving towards. With infinite samples of the processes the power spectra would look like what is given above. save SynthSig sig th if 0 warning off ; opt.outputDir= '/Users/jklymak/Sites/Phy580/html' ; publish( 'FftSynthesizeData' ,opt); end ; Published with MATLAB® 7.7 原文请访问: http://valdez.seos.uvic.ca/~jklymak/Phy580/html/FftSynthesizeData.html
个人分类: Matlab|1315 次阅读|0 个评论
0045: 应用时间序列分析(何书元)一书源代码(硕士阶段成果)
cwhe10 2017-12-3 15:37
硕士研究生时代1—应用时间序列分析(何书元)一书源代码个人版(11) %************************************************************************** % 本程序实现: 验证数据序列分解趋势项和季节项算法的准确性 % 方案设计:应用时间序列分析--何书元(北大出版社)--P5-6 % 完成人:何成文 时间:2014年12月23日 %************************************************************************** % close all; % clear; % clc; % format long % P_X= ; % Len=length(P_X); % % figure % plot(P_X,'r'); %做出原始曲线图来 % grid on % hold on % plot(P_X,'b*'); % title('城市居民季度用煤消耗量'); % %-------------------------------------------------------------------------- % % 方案步骤: % % 1.将序列拆分成110*96的矩阵,然后求行均值,将其作为趋势项; % % 2.将每一列的元素依次减去各自行的均值,再求均值,将其作为季节项; % % 3.序列元素依次减去各自行的均值(趋势项)和各自列的均值(季节项); % % 4.最后,将矩阵数据重组得到新的一维序列,即为随机项数据; % %-------------------------------------------------------------------------- % T=4; % D0=zeros(T,Len/T); %构造96*110矩阵,96是周期,存储数据 % for i=1:Len % D0(i)=P_X(i); % end % D0=D0'; %转置矩阵,使其为110*96的期望矩阵 % % M=zeros(Len/T,1); %存储行向量的均值,110*1矩阵 % for i=1:Len/T %Len/T=110,Len为序列总长度 % for j=1:T % M(i)=D0(i,j)+M(i); % end % end % M=M/T; %趋势项求其均值 % % S=zeros(1,T); %存储数据的季节项均值,1*96矩阵 % for i=1:T % for j=1:Len/T % S(i)=S(i)+D0(j,i)-M(j,1); % end % end % S=S*T/Len; %每列的元素减去行均值的季节项均值 % % D1=zeros(1,Len); %构造新序列,存储去除趋势项和季节项后的新序列 % k=1; % for j=1:Len/T %行循环,110 % for i=1:T %列循环,96 % D1(k)=D0(j,i)-M(j,1)-S(1,i); % k=k+1; % end % end % % figure % plot(D1,'r'); % hold on % plot(D1,'b*'); % grid on % title('去除趋势项和季节项后的新的时间序列'); % %************************************************************************************************完结1 %************************************************************************** % 本程序实现: 验证AR(2)存在周期算法的准确性 % 方案设计:应用时间序列分析--何书元(北大出版社)--P85-86 % 完成人:何成文 时间:2014年12月21日 %************************************************************************** % close all % clear % clc; % % noise=randn(1,80); % data=zeros(1,80); % data(1)=0; % data(2)=0.5; % for i=3:80 %模拟仿真数据生成 % data(i)=0.75*data(i-1)-0.5*data(i-2)+noise(i); % end % % figure % plot(data,'r');hold on; % plot(data,'b*');grid on % title('AR(2)仿真数据曲线图'); % % %-------------------------------------------------------------------------- % % 自相关函数计算,判断其是否具有周期性 % %接口为port序列 % %-------------------------------------------------------------------------- % port=data; %输入数据接口 % % L=length(port); % KK=20; % R=zeros(1,KK); % for k=1:KK % for i=(k+1):L % R(k)=R(k)+port(i-k)*port(i); % end % R(k)=R(k)/(L-k); % end % R0=sum(port.*port)/L; % P=R/R0; % Pp= ; % x= ; %用于确定自相关函数曲线的x坐标,以便于一致性 % figure % plot(x,Pp,'r'); % hold on % plot(x,Pp,'b*'); % grid on % title('自相关函数曲线图判周期(原始数据)'); % xlabel('自相关延迟步数'); % ylabel('自相关系数归一化的数值大小'); % %-------------------------------------------------------------------------- % % %-------------------------------------------------------------------------- % % 求数据的偏相关函数 % %接口说明:需要自相关函数的系数,且R从R(1)开始,不包括R0(自相关系数的最大值) % %-------------------------------------------------------------------------- % Q1=R(1)/R0; % % L1= ; % R1= ; % L2=toeplitz(L1); % Q=inv(L2'*L2)*L2'*R1'; % Q2=Q(2); % % L1= ; % R1= ; % L2=toeplitz(L1); % Q=inv(L2'*L2)*L2'*R1'; % Q3=Q(3); % % L1= ; % R1= ; % L2=toeplitz(L1); % Q=inv(L2'*L2)*L2'*R1'; % Q4=Q(4); % % L1= ; % R1= ; % L2=toeplitz(L1); % Q=inv(L2'*L2)*L2'*R1'; % Q5=Q(5); % % L1= ; % R1= ; % L2=toeplitz(L1); % Q=inv(L2'*L2)*L2'*R1'; % Q6=Q(6); % % L1= ; % R1= ; % L2=toeplitz(L1); % Q=inv(L2'*L2)*L2'*R1'; % Q7=Q(7); % % L1= ; % R1= ; % L2=toeplitz(L1); % Q=inv(L2'*L2)*L2'*R1'; % Q8=Q(8); % % L1= ; % R1= ; % L2=toeplitz(L1); % Q=inv(L2'*L2)*L2'*R1'; % Q9=Q(9); % % L1= ; % R1= ; % L2=toeplitz(L1); % Q=inv(L2'*L2)*L2'*R1'; % Q10=Q(10); % %-------------------------------------------- 11-20 % L1= ; % R1= ; % L2=toeplitz(L1); % Q=inv(L2'*L2)*L2'*R1'; % Q11=Q(11); % % L1= ; % R1= ; % L2=toeplitz(L1); % Q=inv(L2'*L2)*L2'*R1'; % Q12=Q(12); % % L1= ; % R1= ; % L2=toeplitz(L1); % Q=inv(L2'*L2)*L2'*R1'; % Q13=Q(13); % % L1= ; % R1= ; % L2=toeplitz(L1); % Q=inv(L2'*L2)*L2'*R1'; % Q14=Q(14); % % L1= ; % R1= ; % L2=toeplitz(L1); % Q=inv(L2'*L2)*L2'*R1'; % Q15=Q(15); % % L1= ; % R1= ; % L2=toeplitz(L1); % Q=inv(L2'*L2)*L2'*R1'; % Q15=Q(15); % % L1= ; % R1= ; % L2=toeplitz(L1); % Q=inv(L2'*L2)*L2'*R1'; % Q16=Q(16); % % L1= ; % R1= ; % L2=toeplitz(L1); % Q=inv(L2'*L2)*L2'*R1'; % Q17=Q(17); % % L1= ; % R1= ; % L2=toeplitz(L1); % Q=inv(L2'*L2)*L2'*R1'; % Q18=Q(18); % % L1= ; % R1= ; % L2=toeplitz(L1); % Q=inv(L2'*L2)*L2'*R1'; % Q19=Q(19); % % L1= ; % R1= ; % L2=toeplitz(L1); % Q=inv(L2'*L2)*L2'*R1'; % Q20=Q(20); % % QQ= ; % figure % plot(QQ,'m*'); % hold on % plot(QQ,'b'); % grid on % title('偏自相关函数曲线图'); %算法验证结论: % 当自相关系数曲线图存在周期时,该序列极有可能是AR序列, % 因而用偏自相关系数曲线图来验证,获得通过即可! %************************************************************************************************完结2 %************************************************************************** % 本程序实现: 验证MA序列迭代算法的正确性 % 方案设计:应用时间序列分析--何书元(北大出版社)--P93-96 % 完成人:何成文(桂电) 时间:2014年12月21日 %************************************************************************** % close all; % clear;clc; % % noise=2*randn(1,100); % data=zeros(1,100); % data(1)=noise(1); % data(2)=noise(2)-0.36*noise(1); % for i=3:100 %MA(2)序列数据生成 % data(i)=noise(i)-0.36*noise(i-1)+0.85*noise(i-2); % end % figure % plot(data,'r');hold on % plot(data,'b*');grid on; % title('MA(2)序列数据曲线图'); % %-------------------------------------------------------------------------- % % 自相关函数计算,判断其是否具有周期性 % %接口变量: port % %-------------------------------------------------------------------------- % port=data; %输入数据接口 % % L=length(port); % KK=70; % R=zeros(1,KK); % for k=1:KK % for i=(k+1):L % R(k)=R(k)+port(i-k)*port(i); % end % R(k)=R(k)/(L-k); % end % R0=sum(port.*port)/L; % P=R/R0; % Pp= ; % x= ; %用于确定自相关函数曲线的x坐标,以便于一致性 % figure % plot(x,Pp,'r'); % hold on % plot(x,Pp,'b*'); % grid on % title('自相关函数曲线图判周期(原始数据)'); % xlabel('自相关延迟步数'); % ylabel('自相关系数归一化的数值大小'); % %-------------------------------------------------------------------------- % % %-------------------------------------------------------------------------- % % MA(2)系数计算 % %计算公式: 李雷--北大硕士学位论文(导师:谢衷洁) % % 何书元--应用时间序列分析--P93 % %-------------------------------------------------------------------------- % k=12; %12次的结果 % A= ; % C= ; % W= ; % r= ; % F= ; % F=toeplitz(F); % F=inv(F); % II=W*F*W'; % % Var=R0-C'*II*C; %计算结果 % B2=(r-A*II*C)/Var; % % %-------------------------------------------------------------------------- % k=30; %30次的结果 % A= ; % C= ; % W= ; % r= ; % F= ; % F=toeplitz(F); % F=inv(F); % II=W*F*W'; % % Var=R0-C'*II*C; %计算结果 % B2=(r-A*II*C)/Var; % % %-------------------------------------------------------------------------- % k=60; %60次的结果 % A= ; % C= ; % W= ; % r= ; % F= ; % F=toeplitz(F); % F=inv(F); % II=W*F*W'; % % Var=R0-C'*II*C; % B2=(r-A*II*C)/Var; % % 该子程序未能成功调通! %************************************************************************************************未完结3 %************************************************************************** % 本程序实现: 潜周期模型算法验证 % 方案设计: 应用时间序列分析--何书元(北大出版社)--P240-例1.1 % 完成人:何成文(桂电) 时间:2014年12月23日 % 接口设计: % O:谱估计曲线图看出序列的潜在频率点 %************************************************************************** % close all; % clear;clc; % W= '; %角频率值 % A= '; %幅度值 % Angel= '; %相位角 % K=length(W); %角频率个数或潜在周期数目 % D_len=80; %模拟数据生成的长度 % % e_t=randn(1,D_len); % noise=zeros(1,D_len); % noise(1)=e_t(1); % noise(2)=e_t(2)+1.16*noise(1); % noise(3)=e_t(3)+1.16*noise(2)-0.37*noise(1); % noise(4)=e_t(4)+1.16*noise(3)-0.37*noise(2)-0.11*noise(1); % for k=5:D_len %模拟噪声生成 % noise(k)=1.16*noise(k-1)-0.37*noise(k-2)-0.11*noise(k-3)+0.18*noise(k-4)+e_t(k); % end % % data=zeros(K,D_len); %临时数据存放 % for k=1:K % for j=1:D_len % data(k,j)=A(k)*cos(W(k)*j+Angel(k)); % end % end % Data=zeros(1,D_len); %潜在周期模型所用的数据 % for k=1:D_len % for j=1:K % Data(k)=Data(k)+data(j,k); % end % Data(k)=Data(k)+noise(k); % end % figure % plot(Data,'r'); hold on % plot(Data,'b*');grid on % title('潜在周期模拟数据生成曲线图'); % %-------------------------------------------------------------------------- % w= ; %谱估计频率分配间隔 % k1=length(w); %采样点频率数目 % S_w=zeros(1,k1); %定义数据的谱估计 % for k=1:k1 % w1=w(k); %取数据谱估计的频率点 % for j=1:D_len % S_w(k)=S_w(k)+Data(j)*exp(-i*w1*j); % end % S_w(k)=abs(S_w(k)); % end % % figure % plot(w,S_w,'r'); hold on % plot(w,S_w,'b*');grid on % title('潜在周期序列的谱估计曲线图'); %谱估计曲线图看出序列的潜在频率点,直接读图 % %-------------------------------------------------------------------------- % W1= ; %读取谱估计图,得出序列的潜在频率点 % A1=zeros(1,K); %频率点出对应的余弦幅度值 % Angle_1=zeros(1,K); %相位角 % for k=1:K % w1=W1(k); % for j=1:D_len % A1(k)=A1(k)+Data(j)*exp(-i*w1*j); %推导公式:P238--1.28 % end % A1(k)=A1(k)/D_len; %推导公式:P238--1.28 % Angle_1(k)=angle(A1(k)); %推导公式:P239--1.30底下,或者用phase函数虚数相位角 % A1(k)=2*abs( A1(k)); %推导公式:P239--1.30底下 % end % %输出频率、幅度值、相位角矩阵 % 该子程序算法验证成功 %************************************************************************************************完结4 %************************************************************************** % 本程序实现: 时间序列数据潜在周期测试子程序 % 方案设计: 应用时间序列分析--何书元(北大出版社)--P240-例1.1 % 完成人:何成文(桂电) 时间:2014年12月23日 % 接口设计: I--port:输入数据接口 % O:谱估计曲线图看出序列的潜在频率点 % % 注意事项: 由于涉及谱估计,所以i这个变量慎重使用,否则程序测试不了周期!! %************************************************************************** % port= %本测试程序唯一外部接口 % D_len=length(port); %数据序列长度 % %-------------------------------------------------------------------------- % w= ; %谱估计频率分配间隔,实值序列范围3.14内即可 % k1=length(w); %采样点频率数目 % S_w=zeros(1,k1); %定义数据的谱估计 % for k=1:k1 % w1=w(k); %取数据谱估计的频率点 % for j=1:D_len % S_w(k)=S_w(k)+Data(j)*exp(-i*w1*j); % end % S_w(k)=abs(S_w(k)); % end % % figure % plot(w,S_w,'r'); hold on % plot(w,S_w,'b*');grid on % title('潜在周期序列的谱估计曲线图'); %谱估计曲线图看出序列的潜在频率点,直接读图 % 该子程序调试成功 %************************************************************************************************完结5 %************************************************************************** % 本程序实现: 利用Levinson算法实现AR模型系数的递推功能 % 完成人:何成文 时间:2014年12月23日 %************************************************************************** % close all; % clc; % clear; % % 对序列进行生成处理 % %-------------------------------------------------------------------------- % noise=randn(1,996); % noise= ; %生成高斯白噪声(1000个点) % n=1000; % x=zeros(1,n); %初始化待建模序列 % x(1)=0.2; % x(2)=0.2; % x(3)=0.2; % x(4)=0.2; % for i=5:n %循环生成AR序列数据 % x(i)=0.67*x(i-1)-0.337*x(i-2)+0.22*x(i-3)-0.66*x(i-4)+noise(i); % end % figure % plot(x,'r');hold on % plot(x,'b*');grid on % title('AR(4)模型数据序列曲线图'); % %-------------------------------------------------------------------------- % % 自相关函数计算,判断其是否具有周期性 % %接口为port序列 % %-------------------------------------------------------------------------- % port=x; %输入数据接口 % % L=length(port); % KK=50; % R=zeros(1,KK); % for k=1:KK % for i=(k+1):L % R(k)=R(k)+port(i-k)*port(i); % end % R(k)=R(k)/L; %自相关函数矩阵 % end % R0=sum(port.*port)/L; %自相关函数最大值 % P=R/R0; % Pp= ; % x= ; %用于确定自相关函数曲线的x坐标,以便于一致性 % figure % plot(x,Pp,'r'); % hold on % plot(x,Pp,'b*'); % grid on % title('自相关函数曲线图判周期(原始数据)'); % xlabel('自相关延迟步数'); % ylabel('自相关系数归一化的数值大小'); % %-------------------------------------------------------------------------- % % Levinson算法开始递推求AR系数 % % 递推公式来源:应用时间序列分析--何书元--北大出版社--P78 % %-------------------------------------------------------------------------- % AA=zeros(KK,KK); % AA(1,1)=R(1)/R0; % Var=zeros(1,KK); % Var(1)=R0*(1-AA(1,1)^2);; % for k=2:KK % LL1=0; % LL2=0; % for j=1:k-1 % LL1=AA(k-1,j)*R(k-j)+LL1; % LL2=AA(k-1,j)*R(j)+LL2; % end % AA(k,k)=(R(k)-LL1)/(R0-LL2); % for i=1:k-1 % AA(k,i)=AA(k-1,i)-AA(k,k)*AA(k-1,k-i); % end % Var(k)=Var(k-1)*(1-AA(k,k)^2); % end % figure % plot(Var,'r');hold on % plot(Var,'b*');grid on % title('Levinson算法递推阶数误差曲线图'); % %Levinson算法调试成功 % %-------------------------------------------------------------------------- %-------------------------------------------------------------------------- % 利用Levinson算法递推求出的AR系数来验证误差曲线 % 初步定于AR(6)模型 %-------------------------------------------------------------------------- data=x; W= ; data(1)=x(1); data(2)=data(1)*W(1); data(3)=data(2)*W(1)+data(1)*W(2); data(4)=data(3)*W(1)+data(2)*W(2)+data(1)*W(3); for i=5:length(data) data(i)=data(i-1)*W(1)+data(i-2)*W(2)+data(i-3)*W(3)+data(i-4)*W(4); end D=zeros(1,length(data)-4); %误差曲线向量,存储误差数据 for i=5:length(data) D(i-4)=x(i)-data(i); end figure plot(data,'r');grid on title('AR(6)拟合曲线图'); figure plot(D,'r'); hold on plot(D,'b*');grid on title('AR(6)拟合误差曲线图'); %预测代码失败 %-------------------------------------------------------------------------- 看到该代码的人,请不要转载和复制,但是可以个人使用!欢迎回帖交流! 服务宗旨:我为人人,人人为我!
1 次阅读|0 个评论
0015:现代信号谱分析_技术报告(上篇:理论)
热度 3 cwhe10 2016-8-31 22:44
谱分析技术报告 何成文 ( 2016-8-31 ) E-mail : cwhe_10@163.com 参考书籍: 《现代信号谱分析》吴仁彪 - 韩萍 - 冯青 1.1 谱估计定义:对一个有限长平稳序列,估计其在整个频率域内的功率分布; 1.2 谱估计方法: 1 )经典谱分析(非参数非模型方法); 2 )参数化方法( ARMA 时间序列模型); 1.3 当信号确定满足上述方法假设的某种模型时,参数化方法要比非参数化方法得到的谱估计结果更加精确; 1.4 Parseval 定理: ,其中 为能量谱; 1.5 自相关序列:序列与序列延迟 K 阶后生成序列的乘积和; 1.6 能量谱密度可以通过对自相关序列进行 DTFT (离散序列傅里叶变换)得到; 1.7 由于现实生活中采样序列是有限的,因而能量有限,所以能量谱就转化叫做功率谱; 1.8 当序列长度无穷时,自相关序列的 DTFT 结果叫做能量谱; 1.9 功率谱( PSD )定义: ,其中 为自相关或者协方差序列; 1.10 PSD 度量的是信号的自相关在频率 处的功率; 1.11 相干谱定义: ,其表明两个信号线性相关的程度,并且有 ,也叫相关系数; 1.12 PSD 与自相关函数的性质:矩阵为数 m 比较大时,其特征值接近 PSD 的值,其中 ,具体参考文献: ’On the asymptonic eigenvalue distribution of toeplitz matrices’,IEEE,1972. 2.1 非参数功率谱计算公式: 2.2 两种经典方法:周期图法和相关图法; 2.3 周期图法公式: ,其可判断时间序列中可能隐藏的周期性; 2.4 相关法公式: 2.5 周期图法谱分析分辨率极限为 1/N; 2.6 角频率分辨率( rad )与频率分辨率( Hz )的简单关系为: 2.7 周期图谱法缺点:误差大,分辨率不高,因而引入频谱窗技术(实质就是对原始数据进行加权处理); 2.8 频谱窗技术通用公式: , M 为窗的长度,依据 的不同序列可分为矩形窗、三角窗等等; 2.9 窗的长度应在谱分辨率和统计方差之间进行折中选择,一般而言 ; 2.10 常用窗参考文献: 1 )‘ On the use of windows for harmonic analysis with the discretefourier transform’,IEEE,1978. 2)’Modern spectral estimation,Theory andApplication’,1998. 2.11 改进周期图谱估计方法: 1 ) Bartlett 方法:将具有 N 个观测点的可用样本分成 L=N/m 个子样本,每个子样本有 M 个观测点,然后在每个 值上对所有子样本的周期图进行平均,以此来减小周期图中较大的波动; 2 ) Welch 方法:一方面, Welch 方法中数据的分段允许有重叠;另一方面,每段数据在计算周期图之前先加窗处理;参考文献:‘ The use of fast fourier transform for the estimation of powerspectra:A method based on time …,1967 3 ) Daniell 方法:不同频率点处的周期图值是渐进不相关的随机变量。可以考虑在以当前频率 为中心的小区间内对周期图平均,以此来减小基本周期图估计器大的问题。 2.12 非参数化方法适用于大样本; 3.1 有理谱估计是对时间序列的再估计; 3.2 任意有理功率谱密度能与某一信号联系起来,该信号可由功率为 的白噪声通过一个传输函数为 的有理滤波器得到; 3.3 上式子称为自回归滑动平均信号( ARMA )构成的传输函数; 3.4 ARMA 表达式: 3.5 Yule-Walker 算法有两种表达式,第二种比较好,用于计算 AR 模型的系数; 3.6 本书源代码 MATLAB 下载地址: www.prenhall.com/stoica 4.1 淹没于观测噪声中的单个正弦波频率的 NLS (非线性最小二乘估计)估值由无修正周期图的最高谱峰准确给出; 4.2 正弦信号模型: ,其中 4.3 NLS 方法参考文献: ’Statistical analysis of two nonlinear least-squares estimators ofsine-wave parameters in the colored-noise case’ , 1989 4.4 高阶 Yule-walker 方法 4.5 具有频率选择性的 ESPRIT 方法参考文献: 1 ) ’A robust frequency domain subspace algorithm for multicomponentharmonic retrieval’,2001 2)’Frequencydomain method based on the singular value decomposition for frequency selectiveNMP spectroscopy’,2003 关于时域坐标 FFT 转化到频率域的坐标的定义(数字信号处理的 maltab 实现 - 万永革 - 科学出版社 -P50 ): 假设抽样序列为 x(n)= , 抽样间隔为 t0 秒,抽样序列长度为 N 个,则抽样时间总长度为 Nt0 秒,频率域内每个频率的间隔为 f0=1/(Nt0) Hz ,角频率间隔为 w=2*pi*f0 。则频率范围为 K/Nto Hz,K 取 之间的整数(包括 0 )。 当 k=0 时, f=0 ,对应该数据序列的直流分量; 当 k=1 时, f1=1/Nt0 Hz ,代表序列的最大周期 Nto 秒; 当 K=N/2 时,对应最大频率 fmax=1/2t0 ,其周期为 2t0 秒。 致谢: 对中国民航大学冯青老师多年来给予的帮助表示衷心的感谢! 附件(清晰版): 谱分析技术报告_何成文(桂林电子科技大学20160831).pdf 如果文档下载不了,请从CSDN下载: http://download.csdn.net/detail/cauc_14/9618345
个人分类: 科学研究|2937 次阅读|9 个评论
[转载]傅立叶变换的原理、意义以及如何用Matlab实现快速傅立叶变换
sanshiphy 2014-9-16 17:02
以下内容转载自 http://hi.baidu.com/cathy199005/item/d623d4ec06ec9305560f1d9b,大家可以和我的博文 经典谱分析(Power Spectrum Analysis)对照理解http://blog.sciencenet.cn/blog-200199-242357.html 一、傅立叶变换的由来 关于傅立叶变换,无论是书本还是在网上可以很容易找到关于傅立叶变换的描述,但是大都是些故弄玄虚的文章,太过抽象,尽是一些让人看了就望而生畏的公式的罗列,让人很难能够从感性上得到理解,最近,我偶尔从网上看到一个关于数字信号处理的电子书籍,是一个叫Steven W. Smith, Ph.D.外国人写的,写得非常浅显,里面有七章由浅入深地专门讲述关于离散信号的傅立叶变换,虽然是英文文档,我还是硬着头皮看完了有关傅立叶变换的有关内容,看了有茅塞顿开的感觉,在此把我从中得到的理解拿出来跟大家分享,希望很多被傅立叶变换迷惑的朋友能够得到一点启发,这电子书籍是免费的,有兴趣的朋友也可以从网上下载下来看一下,URL地址是: http://www.dspguide.com/pdfbook.htm 要理解傅立叶变换,确实需要一定的耐心,别一下子想着傅立叶变换是怎么变换的,当然,也需要一定的高等数学基础,最基本的是级数变换,其中傅立叶级数变换是傅立叶变换的基础公式。 二、傅立叶变换的提出 让我们先看看为什么会有傅立叶变换?傅立叶是一位法国数学家和物理学家的名字,英语原名是Jean Baptiste Joseph Fourier(1768-1830), Fourier对热传递很感兴趣,于1807年在法国科学学会上发表了一篇论文,运用正弦曲线来描述温度分布,论文里有个在当时具有争议性的决断:任何连续周期信号可以由一组适当的正弦曲线组合而成。当时审查这个论文的人,其中有两位是历史上著名的数学家拉格朗日(Joseph Louis Lagrange, 1736-1813)和拉普拉斯(Pierre Simon de Laplace, 1749-1827),当拉普拉斯和其它审查者投票通过并要发表这个论文时,拉格朗日坚决反对,在近50年的时间里,拉格朗日坚持认为傅立叶的方法无法表示带有棱角的信号,如在方波中出现非连续变化斜率。法国科学学会屈服于拉格朗日的威望,拒绝了傅立叶的工作,幸运的是,傅立叶还有其它事情可忙,他参加了政治运动,随拿破仑远征埃及,法国大革命后因会被推上断头台而一直在逃避。直到拉格朗日死后15年这个论文才被发表出来。 谁是对的呢?拉格朗日是对的:正弦曲线无法组合成一个带有棱角的信号。但是,我们可以用正弦曲线来非常逼近地表示它,逼近到两种表示方法不存在能量差别,基于此,傅立叶是对的。 为什么我们要用正弦曲线来代替原来的曲线呢?如我们也还可以用方波或三角波来代替呀,分解信号的方法是无穷的,但分解信号的目的是为了更加简单地处理原来的信号。用正余弦来表示原信号会更加简单,因为正余弦拥有原信号所不具有的性质:正弦曲线保真度。一个正弦曲线信号输入后,输出的仍是正弦曲线,只有幅度和相位可能发生变化,但是频率和波的形状仍是一样的。且只有正弦曲线才拥有这样的性质,正因如此我们才不用方波或三角波来表示。 三、傅立叶变换分类 根据原信号的不同类型,我们可以把傅立叶变换分为四种类别: 1 非周期性连续信号 傅立叶变换(Fourier Transform) 2 周期性连续信号 傅立叶级数(Fourier Series) 3 非周期性离散信号 离散时域傅立叶变换(Discrete Time Fourier Transform) 4 周期性离散信号 离散傅立叶变换(Discrete Fourier Transform) 下图是四种原信号图例: 这四种傅立叶变换都是针对正无穷大和负无穷大的信号,即信号的的长度是无穷大的,我们知道这对于计算机处理来说是不可能的,那么有没有针对长度有限的傅立叶变换呢?没有。因为正余弦波被定义成从负无穷小到正无穷大,我们无法把一个长度无限的信号组合成长度有限的信号。面对这种困难,方法是把长度有限的信号表示成长度无限的信号,可以把信号无限地从左右进行延伸,延伸的部分用零来表示,这样,这个信号就可以被看成是非周期性离解信号,我们就可以用到离散时域傅立叶变换的方法。还有,也可以把信号用复制的方法进行延伸,这样信号就变成了周期性离解信号,这时我们就可以用离散傅立叶变换方法进行变换。这里我们要学的是离散信号,对于连续信号我们不作讨论,因为计算机只能处理离散的数值信号,我们的最终目的是运用计算机来处理信号的。 但是对于非周期性的信号,我们需要用无穷多不同频率的正弦曲线来表示,这对于计算机来说是不可能实现的。所以对于离散信号的变换只有离散傅立叶变换(DFT)才能被适用,对于计算机来说只有离散的和有限长度的数据才能被处理,对于其它的变换类型只有在数学演算中才能用到,在计算机面前我们只能用DFT方法,后面我们要理解的也正是DFT方法。这里要理解的是我们使用周期性的信号目的是为了能够用数学方法来解决问题,至于考虑周期性信号是从哪里得到或怎样得到是无意义的。 每种傅立叶变换都分成实数和复数两种方法,对于实数方法是最好理解的,但是复数方法就相对复杂许多了,需要懂得有关复数的理论知识,不过,如果理解了实数离散傅立叶变换(real DFT),再去理解复数傅立叶就更容易了,所以我们先把复数的傅立叶放到一边去,先来理解实数傅立叶变换,在后面我们会先讲讲关于复数的基本理论,然后在理解了实数傅立叶变换的基础上再来理解复数傅立叶变换。 还有,这里我们所要说的变换(transform)虽然是数学意义上的变换,但跟函数变换是不同的,函数变换是符合一一映射准则的,对于离散数字信号处理(DSP),有许多的变换:傅立叶变换、拉普拉斯变换、Z变换、希尔伯特变换、离散余弦变换等,这些都扩展了函数变换的定义,允许输入和输出有多种的值,简单地说变换就是把一堆的数据变成另一堆的数据的方法。 四、傅立叶变换的物理意义 傅立叶变换是数字信号处理领域一种很重要的算法。要知道傅立叶变换算法的意义,首先要了解傅立叶原理的意义。傅立叶原理表明:任何连续测量的时序或信号,都可以表示为不同频率的正弦波信号的无限叠加。而根据该原理创立的傅立叶变换算法利用直接测量到的原始信号,以累加方式来计算该信号中不同正弦波信号的频率、振幅和相位。 和傅立叶变换算法对应的是反傅立叶变换算法。该反变换从本质上说也是一种累加处理,这样就可以将单独改变的正弦波信号转换成一个信号。因此,可以说,傅立叶变换将原来难以处理的时域信号转换成了易于分析的频域信号(信号的频谱),可以利用一些工具对这些频域信号进行处理、加工。最后还可以利用傅立叶反变换将这些频域信号转换成时域信号。 从现代数学的眼光来看,傅里叶变换是一种特殊的积分变换。它能将满足一定条件的某个函数表示成正弦基函数的线性组合或者积分。在不同的研究领域,傅里叶变换具有多种不同的变体形式,如连续傅里叶变换和离散傅里叶变换。 在数学领域,尽管最初傅立叶分析是作为热过程的解析分析的工具,但是其思想方法仍然具有典型的还原论和分析主义的特征。任意的函数通过一定的分解,都能够表示为正弦函数的线性组合的形式,而正弦函数在物理上是被充分研究而相对简单的函数类:1. 傅立叶变换是线性算子,若赋予适当的范数,它还是酉算子;2. 傅立叶变换的逆变换容易求出,而且形式与正变换非常类似;3. 正弦基函数是微分运算的本征函数,从而使得线性微分方程的求解可以转化为常系数的代数方程的求解.在线性时不变杂的卷积运算为简单的乘积运算,从而提供了计算卷积的一种简单手段;4. 离散形式的傅立叶的物理系统内,频率是个不变的性质,从而系统对于复杂激励的响应可以通过组合其对不同频率正弦信号的响应来获取;5. 著名的卷积定理指出:傅立叶变换可以化复变换可以利用数字计算机快速的算出(其算法称为快速傅立叶变换算法(FFT))。 正是由于上述的良好性质,傅里叶变换在物理学、数论、组合数学、信号处理、概率、统计、密码学、声学、光学等领域都有着广泛的应用。 五、图像傅立叶变换的物理意义 图像的频率是表征图像中灰度变化剧烈程度的指标,是灰度在平面空间上的梯度。如:大面积的沙漠在图像中是一片灰度变化缓慢的区域,对应的频率值很低;而对于地表属性变换剧烈的边缘区域在图像中是一片灰度变化剧烈的区域,对应的频率值较高。傅立叶变换在实际中有非常明显的物理意义,设f是一个能量有限的模拟信号,则其傅立叶变换就表示f的谱。从纯粹的数学意义上看,傅立叶变换是将一个函数转换为一系列周期函数来处理的。从物理效果看,傅立叶变换是将图像从空间域转换到频率域,其逆变换是将图像从频率域转换到空间域。换句话说,傅立叶变换的物理意义是将图像的灰度分布函数变换为图像的频率分布函数,傅立叶逆变换是将图像的频率分布函数变换为灰度分布函数。 傅立叶变换以前,图像(未压缩的位图)是由对在连续空间(现实空间)上的采样得到一系列点的集合,我们习惯用一个二维矩阵表示空间上各点,则图像可由z=f(x,y)来表示。由于空间是三维的,图像是二维的,因此空间中物体在另一个维度上的关系就由梯度来表示,这样我们可以通过观察图像得知物体在三维空间中的对应关系。为什么要提梯度?因为实际上对图像进行二维傅立叶变换得到频谱图,就是图像梯度的分布图,当然频谱图上的各点与图像上各点并不存在一一对应的关系,即使在不移频的情况下也是没有。傅立叶频谱图上我们看到的明暗不一的亮点,实际上图像上某一点与邻域点差异的强弱,即梯度的大小,也即该点的频率的大小(可以这么理解,图像中的低频部分指低梯度的点,高频部分相反)。一般来讲,梯度大则该点的亮度强,否则该点亮度弱。这样通过观察傅立叶变换后的频谱图,也叫功率图,我们首先就可以看出,图像的能量分布,如果频谱图中暗的点数更多,那么实际图像是比较柔和的(因为各点与邻域差异都不大,梯度相对较小),反之,如果频谱图中亮的点数多,那么实际图像一定是尖锐的,边界分明且边界两边像素差异较大的。对频谱移频到原点以后,可以看出图像的频率分布是以原点为圆心,对称分布的。将频谱移频到圆心除了可以清晰地看出图像频率分布以外,还有一个好处,它可以分离出有周期性规律的干扰信号,比如正弦干扰,一副带有正弦干扰,移频到原点的频谱图上可以看出除了中心以外还存在以某一点为中心,对称分布的亮点集合,这个集合就是干扰噪音产生的,这时可以很直观的通过在该位置放置带阻滤波器消除干扰。 另外我还想说明以下几点: 1、图像经过二维傅立叶变换后,其变换系数矩阵表明: 若变换矩阵Fn原点设在中心,其狊谱能量集中分布在变换系数短阵的中心附近(图中阴影区)。若所用的二维傅立叶变换矩阵Fn的原点设在左上角,那么图像信号能量将集中在系数矩阵的四个角上。这是由二维傅立叶变换本身性质决定的。同时也表明一股图像能量集中低频区域。 2 、变换之后的图像在原点平移之前四角是低频,最亮,平移之后中间部分是低频,最亮,亮度大说明低频的能量大(幅角比较大)。 六、一个关于实数离散傅立叶变换(Real DFT)的例子 先来看一个变换实例,一个原始信号的长度是16,于是可以把这个信号分解9个余弦波和9个正弦波(一个长度为N的信号可以分解成N/2+1个正余弦信号,这是为什么呢?结合下面的18个正余弦图,我想从计算机处理精度上就不难理解,一个长度为N的信号,最多只能有N/2+1个不同频率,再多的频率就超过了计算机所能所处理的精度范围),如下图: 9个正弦信号: 9个余弦信号: 把以上所有信号相加即可得到原始信号,至于是怎么分别变换出9种不同频率信号的,我们先不急,先看看对于以上的变换结果,在程序中又是该怎么表示的,我们可以看看下面这个示例图: 上图中左边表示时域中的信号,右边是频域信号表示方法,从左向右表示正向转换(Forward DFT),从右向左表示逆向转换(Inverse DFT),用小写x 表示每种频率的副度值数组, 因为有N/2+1种频率,所以该数组长度为N/2+1,X ,另一种是表示正弦波的不同频率幅度值:Im X[],Re是实数(Real)的意思,Im是虚数(Imagine)的意思,采用复数的表示方法把正余弦波组合起来进行表示,但这里我们不考虑复数的其它作用,只记住是一种组合方法而已,目的是为了便于表达(在后面我们会知道,复数形式的傅立叶变换长度是N,而不是N/2+1)。 七、用Matlab实现快速傅立叶变换 FFT是离散傅立叶变换的快速算法,可以将一个信号变换到频域。有些信号在时域上是很难看出什么特征的,但是如果变换到频域之后,就很容易看出特征了。这就是很多信号分析采用FFT变换的原因。另外,FFT可以将一个信号的频谱提取出来,这在频谱分析方面也是经常用的。 虽然很多人都知道FFT是什么,可以用来做什么,怎么去做,但是却不知道FFT之后的结果是什意思、如何决定要使用多少点来做FFT。 现在就根据实际经验来说说FFT结果的具体物理意义。一个模拟信号,经过ADC采样之后,就变成了数字信号。采样定理告诉我们,采样频率要大于信号频率的两倍,这些我就不在此啰嗦了。 采样得到的数字信号,就可以做FFT变换了。N个采样点,经过FFT之后,就可以得到N个点的FFT结果。为了方便进行FFT运算,通常N取2的整数次方。 假设采样频率为Fs,信号频率F,采样点数为N。那么FFT之后结果就是一个为N点的复数。每一个点就对应着一个频率点。这个点的模值,就是该频率值下的幅度特性。具体跟原始信号的幅度有什么关系呢?假设原始信号的峰值为A,那么FFT的结果的每个点(除了第一个点直流分量之外)的模值就是A的N/2倍。而第一个点就是直流分量,它的模值就是直流分量的N倍。而每个点的相位呢,就是在该频率下的信号的相位。第一个点表示直流分量(即0Hz),而最后一个点N的再下一个点(实际上这个点是不存在的,这里是假设的第N+1个点,也可以看做是将第一个点分做两半分,另一半移到最后)则表示采样频率Fs,这中间被N-1个点平均分成N等份,每个点的频率依次增加。例如某点n所表示的频率为:Fn=(n-1)*Fs/N。由上面的公式可以看出,Fn所能分辨到频率为为Fs/N,如果采样频率Fs为1024Hz,采样点数为1024点,则可以分辨到1Hz。1024Hz的采样率采样1024点,刚好是1秒,也就是说,采样1秒时间的信号并做FFT,则结果可以分析到1Hz,如果采样2秒时间的信号并做FFT,则结果可以分析到0.5Hz。如果要提高频率分辨力,则必须增加采样点数,也即采样时间。频率分辨率和采样时间是倒数关系。 假设FFT之后某点n用复数a+bi表示,那么这个复数的模就是An=根号a*a+b*b,相位就是Pn=atan2(b,a)。根据以上的结果,就可以计算出n点(n≠1,且n=N/2)对应的信号的表达式为:An/(N/2)*cos(2*pi*Fn*t+Pn),即2*An/N*cos(2*pi*Fn*t+Pn)。对于n=1点的信号,是直流分量,幅度即为A1/N。由于FFT结果的对称性,通常我们只使用前半部分的结果,即小于采样频率一半的结果。 下面以一个实际的信号来做说明。假设我们有一个信号,它含有2V的直流分量,频率为50Hz、相位为-30度、幅度为3V的交流信号,以及一个频率为75Hz、相位为90度、幅度为1.5V的交流信号。用数学表达式就是如下:S=2+3*cos(2*pi*50*t-pi*30/180)+1.5*cos(2*pi*75*t+pi*90/180)。式中cos参数为弧度,所以-30度和90度要分别换算成弧度。我们以256Hz的采样率对这个信号进行采样,总共采样256点。按照我们上面的分析,Fn=(n-1)*Fs/N,我们可以知道,每两个点之间的间距就是1Hz,第n个点的频率就是n-1。我们的信号有3个频率:0Hz、50Hz、75Hz,应该分别在第1个点、第51个点、第76个点上出现峰值,其它各点应该接近0。实际情况如何呢?我们来看看FFT的结果的模值如图所示。 从图中我们可以看到,在第1点、第51点、和第76点附近有比较大的值。我们分别将这三个点附近的数据拿上来细看: 1点: 512+0i 2点: -2.6195E-14 - 1.4162E-13i 3点: -2.8586E-14 - 1.1898E-13i 50点:-6.2076E-13 - 2.1713E-12i 51点:332.55 - 192i 52点:-1.6707E-12 - 1.5241E-12i 75点:-2.2199E-13 -1.0076E-12i 76点:3.4315E-12 + 192i 77点:-3.0263E-14 +7.5609E-13i 很明显,1点、51点、76点的值都比较大,它附近的点值都很小,可以认为是0,即在那些频率点上的信号幅度为0。接着,我们来计算各点的幅度值。分别计算这三个点的模值,结果如下: 1点: 512 51点:384 76点:192 按照公式,可以计算出直流分量为:512/N=512/256=2;50Hz信号的幅度为:384/(N/2)=384/(256/2)=3;75Hz信号的幅度为192/(N/2)=192/(256/2)=1.5。可见,从频谱分析出来的幅度是正确的。 然后再来计算相位信息。直流信号没有相位可言,不用管它。先计算50Hz信号的相位,atan2(-192, 332.55)=-0.5236,结果是弧度,换算为角度就是180*(-0.5236)/pi=-30.0001。再计算75Hz信号的相位,atan2(192, 3.4315E-12)=1.5708弧度,换算成角度就是180*1.5708/pi=90.0002。可见,相位也是对的。根据FFT结果以及上面的分析计算,我们就可以写出信号的表达式了,它就是我们开始提供的信号。 总结:假设采样频率为Fs,采样点数为N,做FFT之后,某一点n(n从1开始)表示的频率为:Fn=(n-1)*Fs/N;该点的模值除以N/2就是对应该频率下的信号的幅度(对于直流信号是除以N);该点的相位即是对应该频率下的信号的相位。相位的计算可用函数atan2(b,a)计算。atan2(b,a)是求坐标为(a,b)点的角度值,范围从-pi到pi。要精确到xHz,则需要采样长度为1/x秒的信号,并做FFT。要提高频率分辨率,就需要增加采样点数,这在一些实际的应用中是不现实的,需要在较短的时间内完成分析。解决这个问题的方法有频率细分法,比较简单的方法是采样比较短时间的信号,然后在后面补充一定数量的0,使其长度达到需要的点数,再做FFT,这在一定程度上能够提高频率分辨力。具体的频率细分法可参考相关文献。
个人分类: 学习笔记|8823 次阅读|0 个评论
《高维随机矩阵的谱理论及其在无线通信和金融统计中的应用》
热度 1 ustcpress 2012-4-11 09:14
《高维随机矩阵的谱理论及其在无线通信和金融统计中的应用》
丛书名:当代科学技术基础理论与前沿问题研究丛书——中国科学技术大学校友文库 (“十一五”国家重点图书出版规划项目) 出版日期:2009年6月 书号ISBN:978-7-312-02274-6 出版社:中国科学技术大学出版社 正文页码:244页(16开) 定价:48.00元 编辑邮箱: edit@ustc.edu.cn (欢迎来索要目录、样章的PDF) 当当网购书链接: http://product.dangdang.com/product.aspx?product_id=20631604 【 内容简介 】 本书讲述了随机矩阵谱理论的主要结果和前瞻研究,以及它在无线通信和现代金融风险理论中的应用。书中前面讲解基本知识,后面分析重要范例,全面介绍了随机矩阵谱理论在这两个领域中的成果。本书对其他需要高维数据分析的领域,能起到示范作用。本书可作为统计学、计算机科学、现代物理、量子力学、无线通信、金融工程、经济学等领域本科生、研究生和工程技术人员学习随机矩阵理论的重要参考资料。 【 作者简介 】 白志东教授, 1968 年本科毕业于中国科学技术大学数学系; 1978 年在该校读研,师从殷涌泉教授学概率,师从陈希孺教授学数理统计, 1982 年于中国科学技术大学数学系获得博士学位; 1990 年被评为第三世界科学院院士。并当选为美国数理统计研究院院士,国际统计协会会员, 2002 年起担任中国概率统计学会常务理事。第二作者和第三作者分别是方兆本教授和梁应敞教授。
个人分类: 院士著述|5772 次阅读|1 个评论
复信号的谱分析
热度 4 huarong1940 2010-3-16 00:01
谱分析技术 在光学、声学、电学、力学和信息技术(声像处理、数据压缩)等科技领域里发挥着重要的作用,这是众所周知的。通常的的谱分析技术,大多建立在 实函数 的 Fourier (傅里叶)变换的数学理论基础之上,即使图像处理用到二重 Fourier 变换,也仅以实函数为输入。然而,经典的 Fourier 变换式是 复指数展开 公式,原本是描述复函数及其双边频谱之间的转换, 变换对的双方皆为复数 。常见的谱分析对象为一维的实信号,一维(实)函数是二维(复)函数的特例,它经 Fourier 变换所得的双边频谱是对称的。因此,古老的谱分析技术只利用了 Fourier 变换的单边频谱,仅使用 Fourier 的 三角级数展开 式即可。人们熟知:单边谱的每一频率成分是 谐波函数 ;但几乎不知道: 双边谱的每一频率成分是旋转矢量 。(参阅文后的上传插图《Fourier变换复指数展开式的几何意义》) 上世纪八十年代初,我在对转轴的回转精度的研究中,认识到转子的径向误差是一个随时间变化的二维的复向量,其检测结果是一个二维的复信号,将该复信号的数据直接输入 FFT ,所获得的输出是一个非对称的双边频谱,同时弄明白了双边谱的几何意义。由此,开创了 复信号谱分析 的研究方向,并取得一系列的研究成果,如 回转精度理论 、 机构综合的谱分析方法 、 极形轨迹发生器 等。 Fourier 变换原本是《信号分析》学科的重要理论基础,但是,许多从事《信号分析》研究和教学的学者,至今并未全面、深入地理解堪称经典的 Fourier 变换。迄今,他们仍认定“ 复信号是实际不存在的 ”、 双边频谱的负半边“既无几何意义,又无物理意义 ” 。甚至还把这陈旧的错误论点写进教科书。其错误的根源在于,将研究分析的信号局限于一维空间之内。 许多理工科学者自以为掌握了处理一维、二维甚至多维空间的数学理论,但是一联系到实际,却只习惯于一维的思维和计算。 为了全面理解 Fourier 变换,仅须把思维扩展到二维空间。 扩展思维的空间的必要性可打个比方来说。通常的认识是:人类生活在三维空间里。曾有传说,某人在某地方突然消失得踪迹全无,很快又在数千公里之外的某地出现。还有“特异功能者”能够从密封的药瓶里取出药片(而不必开启瓶盖或打破药瓶)。研究过多维空间的学者推理说:如果这是真的,那人和药片一定是利用了第四维空间的通道。由此看来,对于三维空间的凡人来说,视野及行动都能扩展至四维空间的,简直就是神仙了!同理,假设有一只生活在一维空间的小虫,它只能在一维的实数数轴上爬来爬去,它那可怜的视力根本看不到左右两侧;另一个二维空间的虫子却能在广阔的二维复平面上自由活动。 相对于一维的可怜虫,二维的小虫就是神仙。 许多经常做 FFT 分析计算的人往往忘记、或根本不知, FFT 程序的输入数组除了[ X ]之外,还有另一个[ Y ](尤其安装在一些大型工具软件系统里的 FFT ,当使用者把实信号数据输入[ X ]后,[ Y ]会自动设置为零)。国内有研究“故障诊断”的知名学者,在检测转轴 x 和 y 两垂直方向的径向误差后,将两组数据分别做 FFT (本来只需做一次 FFT ,却做了两次),再把得到的两个单边频谱合成为椭圆单边谱,并美其名曰“ 全息谱 ”或“ 全矢谱 ”。此法绕了弯路,数学推导并无错误,但是如此 舍近求远 的所谓创“新”却令人可叹又可笑。岂不知, Fourier 老先生早就为你的 x 、 y 信号预备好一个非常漂亮的双边频谱啦! 如果把 Fourier 变换比喻成一个双轮的手推车,人们历来竟一直把一侧轮胎悬空,使它歪着,当作独轮车来推。如今正在使用 FFT 的朋友,您还当它是个独轮车吗? Fourier变换复指数展开式的几何意义
个人分类: 未分类|18334 次阅读|6 个评论

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-5-23 18:19

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部