使用连续正弦波绘制 FFT 离散信号?!
Drawing FFT discrete signal using continuous sine-waves ?!
我用 np.fft.fft() 将离散信号分解为频率。
然后我选择前 N 个频率,现在我想使用以下公式绘制这些频率总和的信号:
amp * np.sin( 2 * np.pi * freq * time + phase )
我根据它们在数组中的位置 (fftfreqs)、np.abs(complex_num) 的振幅和 np.angle(complex_num、deg 的相位提取频率=True),根据我从 fft() 调用中获得的数据。
好像效果不是很好
我做错了什么?
我是否正确理解 complex-num 包含 sinusoid 的放大器和相位?我必须使用 sin&cos 来绘图吗?
关于 fft() 结果的准确解释,文档非常稀少。
PS> 我知道我可以使用 np.fft.ifft() 来得出近似值,但这种方法仅限于原始信号的时间范围。
我想 draw/fit 原始信号在原始时间范围内具有前 N 个频率,但也想在此时间范围后使用这些频率绘制信号的 "continuation",即扩展信号。
我发现了我的错误..首先计算波的正确方法是(topN 频率的总和):
cos_amp * np.cos( 2 * np.pi * freq * time) + sin_amp * np.sin( 2 * np.pi * freq * time)
不仅仅是 sin()..其次,从复数阵列中使用绝对振幅和角相位提取是不正确的。
实部包含 cos-amp,负虚部包含 sin 振幅,即一旦我从 fft() 中得到复数数组,我就会这样做:
fft_res = np.fft.fft(signal)
.... topN_freqs_idx = find top freqs from PSD
all_freqs = np.fft.fftfreq(N)
freqs = all_freqs[topN_freq_idx]
norm = fft_res[topN_freq_idx] / (N/2)
cos_amp = np.real(norm)
sin_amp = -np.imag(norm)
我是从这里了解到的:
http://www.dspguide.com/ch8/5.htm
我用 np.fft.fft() 将离散信号分解为频率。 然后我选择前 N 个频率,现在我想使用以下公式绘制这些频率总和的信号:
amp * np.sin( 2 * np.pi * freq * time + phase )
我根据它们在数组中的位置 (fftfreqs)、np.abs(complex_num) 的振幅和 np.angle(complex_num、deg 的相位提取频率=True),根据我从 fft() 调用中获得的数据。
好像效果不是很好
我做错了什么? 我是否正确理解 complex-num 包含 sinusoid 的放大器和相位?我必须使用 sin&cos 来绘图吗? 关于 fft() 结果的准确解释,文档非常稀少。
PS> 我知道我可以使用 np.fft.ifft() 来得出近似值,但这种方法仅限于原始信号的时间范围。 我想 draw/fit 原始信号在原始时间范围内具有前 N 个频率,但也想在此时间范围后使用这些频率绘制信号的 "continuation",即扩展信号。
我发现了我的错误..首先计算波的正确方法是(topN 频率的总和):
cos_amp * np.cos( 2 * np.pi * freq * time) + sin_amp * np.sin( 2 * np.pi * freq * time)
不仅仅是 sin()..其次,从复数阵列中使用绝对振幅和角相位提取是不正确的。 实部包含 cos-amp,负虚部包含 sin 振幅,即一旦我从 fft() 中得到复数数组,我就会这样做:
fft_res = np.fft.fft(signal)
.... topN_freqs_idx = find top freqs from PSD
all_freqs = np.fft.fftfreq(N)
freqs = all_freqs[topN_freq_idx]
norm = fft_res[topN_freq_idx] / (N/2)
cos_amp = np.real(norm)
sin_amp = -np.imag(norm)
我是从这里了解到的: http://www.dspguide.com/ch8/5.htm