Go语言 为什么我的两个正弦波的离散傅立叶变换在零点有一个巨大的尖峰?

utugiqy6  于 2023-09-28  发布在  Go
关注(0)|答案(1)|浏览(115)

我可以对两个正弦波(比如频率1和10)的相加进行傅立叶变换。我将其转换成频率-幅值图,通过使用从持续时间和采样数量计算的采样频率。
我在1和10得到两个明显的亮点,正如预期的,但在0也有这个巨大的尖峰,我无法解释。
生成的代码将正弦波加在一起以创建信号:

const INPUT_NUM_SAMPLES = 1 << 10
const INPUT_DURATION = 10
INPUT_FREQS := []float64{1, 10}

fftInput := make([]complex128, INPUT_NUM_SAMPLES)
for _, freq := range INPUT_FREQS {
    for i := range fftInput {
        inputPoint := float64(i) / float64(INPUT_NUM_SAMPLES) * INPUT_DURATION
        fftInput[i] += complex(inputPoint, math.Cos(inputPoint*freq*math.Pi*2))
    }
}

执行傅立叶变换的代码:

fftOutput := fourier.NewCmplxFFT(INPUT_NUM_SAMPLES).Coefficients(make([]complex128, len(fftInput)), fftInput)

生成频率-幅度图的代码

R := float64(INPUT_NUM_SAMPLES) / float64(INPUT_DURATION)
fmt.Printf("Sampling frequency: %f\n", R)
freqMag := make([]complex128, len(fftOutput))
for index, value := range fftOutput {
    freqMag[index] = complex((float64(index)/INPUT_NUM_SAMPLES)*R, math.Sqrt(real(value)*real(value)+imag(value)*imag(value)))
}

频率-幅度图(省略另一半对称):x1c 0d1x信号图:

我试过几件事,包括:
1.使用不同的FFT库
1.反转输入的真实的部和虚部,奇怪的是,这似乎没有任何区别。我预计在1和10处会有两个光点,这将是它(不算对称性,输出的另一边已经从图中省略了)

wqnecbli

wqnecbli1#

线的右手边

fftInput[i] += complex(inputPoint, math.Cos(inputPoint*freq*math.Pi*2))

用真实的部inputPoint和虚部math.Cos(inputPoint*freq*math.Pi*2)构造复值,如

x(t) = 2 t + j (cos(t π 2) + cos(t π 4)),  0 ≤ t < 10.

因此,输入信号是斜坡(由于真实的部)加上两个正弦曲线的和(来自虚部)。斜坡是非负的,这解释了在频率0(DC)处频谱中的大尖峰。此外,斜坡在间隔端点处是不连续的,解释了其他显著的低频分量。
根据你的描述,我相信你的意图是输入信号是两个实值正弦曲线。将行更改为:

fftInput[i] += complex(math.Cos(inputPoint*freq*math.Pi*2), 0.0)

相关问题