rp正弦波

时间:2018-06-21 12:58:48

标签: python numpy signal-processing fft complex-numbers

下面是我的代码 我想在-50Mhz和50Mhz之间扫描400MHz音调。意思是 扫描范围应在350MHz至450MHz之间。但是事实并非如此。别 了解这是什么原因。已经提出这是因为频率是相位的导数。我在'sweep_sine'函数的注释行中也给出了建议,但这似乎也无济于事。任何帮助,将不胜感激。

添加了意外程序输出的图像。如您所见,我能够将400MHz音调转换为300MHz。当我尝试以类似于shift的方式进行扫描时;输出不正确,因为它不会从350MHz扫到450MHz,中间是400MHz音调。

我现在能够正确扫描信号,如图2所示。当信号为e ^ i2 * pi f t形式时,时域信号看起来也很好。但是,当我使用形式为sin(2 * pi f t)的真实信号时域版本似乎已损坏(图像3)。可能是什么原因呢?谢谢。

https://i.stack.imgur.com/9H1Dk.png

https://i.stack.imgur.com/Ey3tQ.png

https://i.stack.imgur.com/FzmDS.png

import numpy as np
import matplotlib.pyplot as plt

def gen_sig(freq=380e6, fs=6080e6, n_samp=6400):
    ts = 1/fs
    t_arr = np.arange(0, n_samp)*ts
    sig = np.exp(2 * 1j * np.pi * freq * t_arr)
    #sig = np.sin(2 * np.pi * freq * t_arr)
    return sig,ts

def freq_shift_sine(sine, ts, shift_freq = 50e6):
    tx_sig_t = np.linspace(0, ts*sine.shape[-1], num=sine.shape[-1])
    #tx_sig_sqrd =  np.square(tx_sig_t)
    #hift the sine
    freq_shftd_sig = sine * np.exp(1.0j * 2 * np.pi * (shift_freq * tx_sig_t))
    #freq_shftd_sig = sine * np.exp(1.0j * np.pi * (shift_freq * tx_sig_sqrd))    
    return freq_shftd_sig

def sweep_sine(sine, ts, up_lim = 50e6, low_lim = -50e6):
    tx_sig_t = np.arange(0, sine.shape[-1])*ts
    tx_sig_sqrd =  np.square(tx_sig_t)
    phi = low_lim*tx_sig_t + (up_lim-low_lim)*(tx_sig_sqrd/(2*ts*sine.shape[-1]))
    dopp_shftd_sig = sine * np.exp(1.0j* 2 *np.pi * phi)
    return dopp_shftd_sig   

if __name__=='__main__':
    #generate a sine wave 16 times over sampled
    tx_sig, t_samp = gen_sig(freq=400e6, fs=6400e6, n_samp=6400)
    #do an fft
    tx_sig_fft = np.fft.fft(tx_sig)
    #generate freqency axis for fft
    freq_arr = np.fft.fftfreq(tx_sig.shape[-1], t_samp)
    #shift sine wave
    tx_sig_shifted = freq_shift_sine(tx_sig, t_samp, shift_freq = -100e6)
    #fft the shifted sine
    tx_sig_shftd_fft = np.fft.fft(tx_sig_shifted) 
    #sweep sine wave by up_lim+low_lim Hz
    tx_sig_swept = sweep_sine(tx_sig, t_samp, up_lim = 50e6, low_lim = -50e6)
    #fft the swept sine
    tx_sig_swept_fft = np.fft.fft(tx_sig_swept)    
    plt.figure()
    plt.plot(freq_arr, abs(tx_sig_fft))
    plt.plot(freq_arr, abs(tx_sig_shftd_fft))       
    plt.plot(freq_arr, abs(tx_sig_swept_fft))
    plt.axis([0,1e9, 0, 2e3])
    plt.figure()
    plt.plot(tx_sig)
    plt.plot(tx_sig_shifted)
    plt.plot(tx_sig_swept)    
    plt.axis([0,100, -1.2, 1.2])

2 个答案:

答案 0 :(得分:1)

我可能是错的,但我认为问题出在您的信号上。您只有其中的一部分,而在复杂平面中移动相位并没有太大帮助。

此问题的可能解决方法是使信号复杂。最好的方法是进行希尔伯特变换并将其用作信号。

您的代码可能看起来像这样

import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import hilbert


def gen_sine(freq=380e6, fs=6080e6, n_samp=6400):
    ts = 1/fs
    t_arr = np.arange(0, n_samp)*ts
    #sine_sig = np.exp(2 * 1j * np.pi * freq * t_arr)
    sine_sig = np.sin(2 * np.pi * freq * t_arr)
    return sine_sig,ts

def freq_shift_sine(sine, ts, shift_freq = 50e6):
    tx_sig_t = np.linspace(0, ts*sine.shape[-1], num=sine.shape[-1])
    #tx_sig_sqrd =  np.square(tx_sig_t)
    #hift the sine
    freq_shftd_sig = hilbert(tx_sig) * np.exp(1.0j * 2 * np.pi * (shift_freq * tx_sig_t))
    #freq_shftd_sig = sine * np.exp(1.0j * np.pi * (shift_freq * tx_sig_sqrd))    
    return freq_shftd_sig

def sweep_sine(sine, ts, up_lim = 50e6, low_lim = -50e6):
    #tx_sig_t = np.arange(0, sine.shape[-1])*ts 
    tx_sig_t = np.linspace(0, ts*sine.shape[-1], num=sine.shape[-1])
    #tx_sig_sqrd =  np.square(tx_sig_t)   
    freq_step_arr = np.linspace(low_lim, up_lim, sine.shape[-1])
    dopp_shftd_sig = hilbert(tx_sig) * np.exp(1.0j * 2 * np.pi * (freq_step_arr * tx_sig_t))
    #dopp_shftd_sig = sine * np.exp(1.0j * np.pi * (freq_step_arr * tx_sig_sqrd))
    return dopp_shftd_sig

if __name__=='__main__':
    #generate a sine wave 16 times over sampled
    tx_sig, t_samp = gen_sine(freq=400e6, fs=6400e6, n_samp=6400)
    #do an fft
    tx_sig_fft = np.fft.fft(tx_sig)
    #generate freqency axis for fft
    freq_arr = np.fft.fftfreq(tx_sig.shape[-1], t_samp)
    #shift sine wave
    tx_sig_shifted = freq_shift_sine(tx_sig, t_samp, shift_freq = -100e6)
    #fft the shifted sine
    tx_sig_shftd_fft = np.fft.fft(tx_sig_shifted) 
    #sweep sine wave by up_lim+low_lim Hz
    tx_sig_swept = sweep_sine(tx_sig, t_samp, up_lim = 50e6, low_lim = -50e6)
     #fft the swept sine
    tx_sig_swept_fft = np.fft.fft(tx_sig_swept)    
    #plt.figure()
    #plt.plot(freq_arr, abs(tx_sig_swept_fft))    
    #plot sine wave fft
    #plt.figure()
    plt.figure(1)
    plt.plot(freq_arr, abs(tx_sig_fft))
    plt.plot(freq_arr, abs(tx_sig_shftd_fft))       
    plt.plot(freq_arr, abs(tx_sig_swept_fft))
    plt.axis([0,1e9, 0, 2e3])
    plt.figure(2)
    plt.specgram(tx_sig_swept, NFFT=80, Fs=6400e6, noverlap=16)
    #plt.axis([0,0.000001, 0, 5e6])
    plt.figure(3)
    plt.subplot(311)
    t_time = np.arange(0, tx_sig.shape[-1])*t_samp
    plt.plot(t_time, tx_sig)
    plt.plot(t_time, np.imag(hilbert(tx_sig)) )
    plt.subplot(312)
    plt.plot(t_time, tx_sig_shifted)
    plt.subplot(313)
    plt.plot(t_time, tx_sig_swept )
    plt.show()

它产生或多或少的确定的频谱图,并且不会破坏所得的信号。希望对您有所帮助。

答案 1 :(得分:0)

您犯了一个非常普遍的错误。在每个时间步长增加频率和时间(将它们相乘以创建用于exp或正弦函数的相位参数输入时),会使频率增加太多。而是找出相位在每个新的时间步长上应针对该时间步长的所需频率变化多少,然后添加该相位差,而不是进行乘法运算以将新的相位输入到您的正弦或exp函数。