我做np.fft.fft()将离散信号分解为频率。 然后我选择前N个频率,现在我想使用以下公式绘制这些频率之和的信号:
amp * np.sin( 2 * np.pi * freq * time + phase )
根据我从fft()得到的数据,我根据它们在数组中的位置(fftfreqs),np.abs(complex_num)的振幅和np.angle(complex_num,deg = True)的相位提取freqs调用
它看起来效果不佳。
我做错了什么? 我是否正确理解复数包含正弦曲线的放大器和相位?我是否必须使用sin& cos作为绘图? 关于fft()的结果的精确解释,文档非常稀疏。
PS>我知道我可以使用np.fft.ifft()来绘制近似值,但这种做法仅限于原始信号的时间范围。 我想在原始时间帧中使用前N个频率绘制/拟合原始信号,但也要在此时间帧之后使用这些频率(即扩展信号)绘制信号的“延续”。
答案 0 :(得分:2)
我发现了我的错误..首先计算波浪的正确方法是(topN freqs的总和):
cos_amp * np.cos( 2 * np.pi * freq * time) + sin_amp * np.sin( 2 * np.pi * freq * time)
不仅仅是sin()..第二,使用复数阵列的abs-amplitude和angle-phase提取是不正确的。 实部包含cos-amp,负虚部包含sin-amplitude,即一旦我从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