matlab的分数阶傅里叶变换函数,[转载]分数阶傅里叶变换frft数值计算,求助!!...

希望有解决了我这些问题或之一的的人能够指教一二,小女子感激不尽啊!!

a4c26d1e5885305701be709a3d33442f.png

参考Ozaktas提出的采样型算法,我的matlab程序如下:

在程序中的三种信号形式下,只有第一种情况能够准确的估计出信号s(t)的f0 和u,第二、三中情况下只能估计出u,f0就不正确了,思考了很久业不知道问题出在哪里,求高人指点。

matlab M文件程序

N=511;

fi=0;

f0=20; %初始频率0;%

fs=97.6;%600; % 抽样频率1e6;%

k=8; %调频率3e4;%

f=zeros(1,N);%频率,每个frft值代表的频率(分正负)

t=zeros(1,N);%时间,每个时域信号样点代表的时间(分正负)

%*****************************************************

%*******第一种情况:信号时间区间为【-N/2,N/2】

%*****************************************************

for n=-fix(N/2):fix(N/2)

x(n+ceil(N/2))=exp(j*fi+j*2*pi*f0*n/fs+j*pi*k*((n/fs)*(n/fs)));%generate signal t=n/fs

t(n+ceil(N/2))=n/fs;%time

f(n+ceil(N/2))=n*fs/N;%freq

end

%*****************************************************

%*******第二种情况:信号时间区间为【0,N-1】

%*****************************************************

for n=0:N-1

x(n+1)=exp(j*fi+j*2*pi*f0*n/fs+j*pi*k*((n/fs)*(n/fs)));%generate signal t=n/fs

t(n+1)=n/fs;%time f(n+1)=(n-fix(N/2))*fs/N;%freq

end

%*****************************************************

%*******第三种情况:信号时间区间为【-N/2,N/2】+N

%*****************************************************

for n=-fix(N/2)+N:fix(N/2)+N

x(n+ceil(N/2)-N)=exp(j*fi+j*2*pi*f0*n/fs+j*pi*k*((n/fs)*(n/fs)));%generate signal t=n/fs

t(n+ceil(N/2)-N)=n/fs;%time

f(n+ceil(N/2)-N)=(n-N)*fs/N;%freq

end

X=awgn(x,0);

r=0.01;

a=[0:r:2];%fractional power

G=zeros(length(a),length(X)); %for different power do frft

h=0;

for l=1:length(a)

T=frft(X,a(l));

G(l,:)=abs(T(:));

if(h<=max(abs(T(:))))

h=max(abs(T(:)));

p1=a(l); %阶数

end

end

for m=1:length(a);

y(m)=max(abs(G(m,:)));

end

tt=t(N)-t(1);%截取信号的持续时间

kk=tt/(fs);

kr=-cot(p1*pi/2)/kk % k参数的估计值,参考公式(4-30)

FF=frft(x,p1);

[aa,bb]=max(abs(FF));

bb

u0=f(bb);

ff0=u0*csc(p1*pi/2) % 中心频率f0的估计值

figure=figure('Color',[1 1 1]);

plot(f*csc(p1*pi/2),abs(FF),'r');

function Faf = frft(f, a)

% The fast Fractional Fourier Transform快速分数傅里叶变换

% input: f = samples of the signal

% a = fractional power分数幂

% output: Faf = fast Fractional Fourier transform

error(nargchk(2, 2, nargin));

f = f(:);

N = length(f);

shft = rem((0:N-1)+fix(N/2),N)+1;

sN = sqrt(N);

a = mod(a,4);

% do special cases

if (a==0), Faf = f; return; end;

if (a==2), Faf = flipud(f); return; end;

if (a==1), Faf(shft,1) = fft(f(shft))/sN; return; end if (a==3), Faf(shft,1) = ifft(f(shft))*sN; return; end

% reduce to interval 0.5 

if (a>2.0), a = a-2; f = flipud(f); end

if (a>1.5), a = a-1; f(shft,1) = fft(f(shft))/sN; end%即将参与frft的信号变为原始信号f的傅立叶变换

if (a<0.5), a = a+1; f(shft,1) = ifft(f(shft))*sN; end%即将参与frft的信号变为原始信号f的逆傅立叶变换

% the general case for 0.5 

alpha = a*pi/2;

tana2 = tan(alpha/2);

sina = sin(alpha);

f = [zeros(N-1,1) ; interp(f) ; zeros(N-1,1)];

% chirp premultiplication

chrp = exp(-i*pi/N*tana2/4*(-2*N+2:2*N-2)'.^2);

f = chrp.*f;

% chirp convolution

c = pi/N/sina/4;

y=exp(i*c*(-(4*N-4):4*N-4)'.^2);

Faf = fconv(exp(i*c*(-(4*N-4):4*N-4)'.^2),f);

Faf = Faf(4*N-3:8*N-7)*sqrt(c/pi);%去卷积结果的中间1/3总长度的数据点数

% chirp post multiplication

Faf = chrp.*Faf;

% normalizing constant

Faf = exp(-i*(1-a)*pi/4)*Faf(N:2:end-N+1);

function xint=interp(x)

% sinc interpolation

N = length(x);

y = zeros(2*N-1,1);

y(1:2:2*N-1) = x;

xint = fconv(y(1:2*N-1), sinc([-(2*N-3):(2*N-3)]'/2));

xint = xint(2*N-2:end-2*N+3);%取卷积结果的中间1/3总长度的数据

function z = fconv(x,y)

% convolution by fft

N = length([x(:);y(:)])-1;

P = 2^nextpow2(N);

z = ifft( fft(x,P) .* fft(y,P));

z = z(1:N);

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值