声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1464|回复: 10

[编程技巧] 不知道错在哪里了

[复制链接]
发表于 2007-6-12 16:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
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 < a < 1.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
if (a<0.5), a = a+1; f(shft,1) = ifft(f(shft))*sN; end
% the general case for 0.5 < a < 1.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;
Faf = fconv(exp(i*c*(-(4*N-4):4*N-4)'.^2),f);
Faf = Faf(4*N-3:8*N-7)*sqrt(c/pi);
% 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);

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);


N=256;
fs=100;
f0=2.5;
a=0.7;
alpha=a*pi/2;
dt=1/fs;
t=(0:N-1)*dt;
df=fs/N;
f=(0:N-1)*df;
s=zeros(1,N);
u=zeros(1,N);
i=sqrt(-1);
for m=1:N
    s(m)=exp(-5*m*dt+i*cos(2*pi*f0*m*dt));
    u(m)=sqrt((m*dt).^2+(m*df).^2).*sin(alpha+atan(m*dt./(m*df)));
end
F1=frft(s,a);
A1=F1'.*u;
B1=frft(A1,-a);
F2=frft(s,-a);
A2=F2'.*u;
B2=frft(A2,a);
dw=zeros(1,N);
w0=zeros(1,N);
w=zeros(1,N);
for m=1:N
    dw(m)=(abs(B1').^2-abs(B2').^2)/(2*m*dt)/sin(2*alpha)/(abs(s).^2);
    w(m)=dw(m)/(2*pi);
    w0(m)=sin(2*pi*f0*m*dt);
end
plot(t,w,'r:',t,w0,'b-');

[ 本帖最后由 eight 于 2007-6-12 16:40 编辑 ]
回复
分享到:

使用道具 举报

发表于 2007-6-12 16:40 | 显示全部楼层
原帖由 justwee 于 2007-6-12 16:25 发表
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(nar ...


请给出出错信息,而不是要别人猜
 楼主| 发表于 2007-6-12 19:01 | 显示全部楼层

回复 #2 eight 的帖子

我的程序是基于分数阶傅立叶变换的信号瞬时频率估计,运行显示如下错误:
??? Undefined command/function 'sinc'.

Error in ==> frft>interp at 43
xint = fconv(y(1:2*N-1), sinc([-(2*N-3):(2*N-3)]'/2));

Error in ==> frft at 25
f = [zeros(N-1,1) ; interp(f) ; zeros(N-1,1)];

Error in ==> QQ at 20
F1=frft(s,a);
发表于 2007-6-12 19:07 | 显示全部楼层
原帖由 justwee 于 2007-6-12 19:01 发表
我的程序是基于分数阶傅立叶变换的信号瞬时频率估计,运行显示如下错误:
??? Undefined command/function 'sinc'.

Error in ==> frft>interp at 43
xint = fconv(y(1:2*N-1), sinc([-(2*N-3):(2*N-3)]'/2 ...


sinc 是自定义的函数吗?要放在同一目录下
 楼主| 发表于 2007-6-12 20:15 | 显示全部楼层

回复 #4 eight 的帖子

是sa函数,matlab 中应该有库函数的吧?
发表于 2007-6-12 20:16 | 显示全部楼层
原帖由 justwee 于 2007-6-12 20:15 发表
是sa函数,matlab 中应该有库函数的吧?


我这个版本自带 sinc 函数,不知道你的版本是否有,自己 help 一下吧
 楼主| 发表于 2007-6-12 20:23 | 显示全部楼层

回复 #6 eight 的帖子

结果有了,但是和我的预想结果相差很多,为什么?
 楼主| 发表于 2007-6-12 20:25 | 显示全部楼层

回复 #6 eight 的帖子

红线应该和蓝线差不多才对的
发表于 2007-6-12 20:27 | 显示全部楼层
原帖由 justwee 于 2007-6-12 20:23 发表
结果有了,但是和我的预想结果相差很多,为什么?


你的程序带有输入参数,旁人无法帮忙,自己检查一下吧
 楼主| 发表于 2007-6-12 20:35 | 显示全部楼层

回复 #9 eight 的帖子

只有a可变,a是分数维傅立叶变换的维数。
 楼主| 发表于 2007-6-12 20:36 | 显示全部楼层

回复 #9 eight 的帖子

其它的不用考虑的。
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-9-24 05:33 , Processed in 0.076393 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表