我在Fortran 90中使用FFTPACK5.1时遇到问题,它包含用于计算离散傅里叶变换的子程序。我设法安装它并使用例程但是当我用一个频率 A 的简单正弦波检查一切是否正常时,我得到的非零系数不在A(在频率空间,在光谱)但 2A 。频谱发生了变化,我不明白为什么。我几乎肯定(但我有疑问)我正确地计算了频率轴的步骤:
N是我原始正弦波的点数,而Fech我的采样频率我计算频率轴的步长为df(i)= Fech(i-1)/ N.
我正在使用 rfft1f 例程,所以如果有人有经验并且知道我的问题,那么我将非常了解这里的错误。
这是我的代码:
! n: number of samples in the discret signal
integer ( kind = 4 ), parameter :: n = 4096
real, parameter :: deuxpi=6.283185307
!frequence is the frequence of the signal
!fech is the frequence of sampling
real :: frequence,fech
integer :: kk
! r is the signal i want to process
! t is the built time and f is the built frequency
real ( kind = 4 ) r(n),t(n),f(n)
!Arrays routines need to work (internal recipe):
real ( kind = 4 ), allocatable, dimension ( : ) :: work
real ( kind = 4 ), allocatable, dimension ( : ) :: wsave
!size of arrays wsave and work for internal recipe
lensav = n + int ( log ( real ( n, kind = 4 ) ) / log ( 2.0E+00 ) ) + 4
lenwrk = n
allocate ( work(1:lenwrk) )
allocate ( wsave(1:lensav) )
! initializes rttft1f, wsave array
call rfft1i ( n, wsave, lensav, ier )
frequence=0.5
fech=20
! I built here the signal
do kk=1,n
t (kk) = (kk-1) / (fech)
f (kk) = fech*(kk-1) / n
r (kk) = sin( deuxpi * t(kk) * frequence )
end do
!and I call the rfft1f to build the Discrete Fourier Transform:
call rfft1f ( n, inc, r, lenr, wsave, lensav, work, lenwrk, ier )
!I get back r which contains now the fourier coefficients and plot it
我期望用一个简单的正弦波在0.5的频率处得到一个dirac(参见代码),但我在频域中得到一个dirac。此外,频谱看起来很奇怪......这就是我得到的:
答案 0 :(得分:0)
如同计算实值序列的离散傅立叶变换的例程一样,所得到的复值频谱仅返回一半频谱。要将值拟合到原始N元素数组中,仅返回第一个值的实部(始终为实数)。类似地,在偶数n
的情况下,返回n
/ 2复数值(也总是实数)的实部。对于所有其他复杂值,实部和虚部都是交错的。
因此,对于偶数n
,相应的频率由下式给出:
r(1) -> 0
r(2), r(3) -> Delta
r(4), r(5) -> 2*Delta
...
r(n) -> (n/2)*Delta
对于奇数n
:
r(1) -> 0
r(2), r(3) -> Delta
r(4), r(5) -> 2*Delta
...
r(n-1),r(n) -> ((n-1)/2) * Delta
其中Delta为fech/n
。
要绘制复数值,您可能希望绘制实数(指数1,2,4,6,...)和&虚数(指数3,5,7,...)部分作为两个单独的图,或幅度&阶段(再次作为两个单独的图表)。