我可以对两个正弦波(比如频率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处会有两个光点,这将是它(不算对称性,输出的另一边已经从图中省略了)
1条答案
按热度按时间wqnecbli1#
线的右手边
用真实的部
inputPoint
和虚部math.Cos(inputPoint*freq*math.Pi*2)
构造复值,如因此,输入信号是斜坡(由于真实的部)加上两个正弦曲线的和(来自虚部)。斜坡是非负的,这解释了在频率0(DC)处频谱中的大尖峰。此外,斜坡在间隔端点处是不连续的,解释了其他显著的低频分量。
根据你的描述,我相信你的意图是输入信号是两个实值正弦曲线。将行更改为: