Fortran 连续(sinc)小波变换给出了NaN
我想通过连续香农小波变换对原始信号进行相移。Fortran 连续(sinc)小波变换给出了NaN,fortran,Fortran,我想通过连续香农小波变换对原始信号进行相移。 构造的信号的结果都是NaN,尽管编译时没有任何错误消息。您可能在某处被零除。使用所有调试标志编译并启用浮点异常,您将找到问题所在。非常感谢!你的评论很有意义,也很有帮助。sinc(x)=sin(pi*t)/(pi*t)在t->0时趋向于1,但当t为0.0d0(数字)时,这会产生浮点异常(除以零)。这发生在t(i)=(i*dt-m)/(2**n)上,因为dt=0.01d0,i和m是整数。所以也许最好编写一个自定义sinc()函数,将t=0作为例外处理?
构造的信号的结果都是NaN,尽管编译时没有任何错误消息。您可能在某处被零除。使用所有调试标志编译并启用浮点异常,您将找到问题所在。非常感谢!你的评论很有意义,也很有帮助。sinc(x)=sin(pi*t)/(pi*t)在t->0时趋向于1,但当t为0.0d0(数字)时,这会产生浮点异常(除以零)。这发生在t(i)=(i*dt-m)/(2**n)上,因为dt=0.01d0,i和m是整数。所以也许最好编写一个自定义sinc()函数,将t=0作为例外处理?(例如,如果(abs(t)<1.0d-6)…其他…)您可能在某处被零除。使用所有调试标志编译并启用浮点异常,您将找到问题所在。非常感谢!你的评论很有意义,也很有帮助。sinc(x)=sin(pi*t)/(pi*t)在t->0时趋向于1,但当t为0.0d0(数字)时,这会产生浮点异常(除以零)。这发生在t(i)=(i*dt-m)/(2**n)上,因为dt=0.01d0,i和m是整数。所以也许最好编写一个自定义sinc()函数,将t=0作为例外处理?(例如,如果(abs(t)<1.0d-6)…其他…)。
implicit none
character*20 fflname,oflname
integer length_sgnl
real*8 pi, dt, m, n, theta
parameter ( length_sgnl=11900, dt=0.01d0, m=1, n=1, pi=3.1416
& ,theta=0.2 )
integer i
complex*16 cj, coeff ,sgnl(1 : length_sgnl)
real*8 t(1 : length_sgnl)
parameter ( cj = dcmplx(0, 1) )
real*8 time, real_sgnl, imag_sgnl
oflname="filtered.data"
fflname="artificial"
open(11, file = oflname)
do i=1, length_sgnl
read(11, *) time, real_sgnl, imag_sgnl
sgnl(i) = dcmplx(real_sgnl, imag_sgnl)
t(i) = (i*dt - m) / (2**n)
enddo
coeff = 0
do i=1, length_sgnl
coeff = coeff
& + sgnl(i) * sin(pi*t(i)) / (pi*t(i)) * exp (-cj*2*pi*t(i))
enddo
do i=1, length_sgnl
sgnl(i) = sgnl(i)
& - coeff * sin(pi*t(i)) / (pi*t(i)) * exp (-cj*2*pi*t(i))
& + coeff * sin(pi*t(i)) / (pi*t(i)) * exp (-cj*2*pi*t(i))
& * exp (cj*theta)
enddo
open(12, file = fflname)
do i=1, length_sgnl
write(12, *) i*dt, sgnl(i)
enddo
close(12)
stop
end