Щебетание синусоиды

1

Ниже мой код, где я хочу, чтобы поднять 400 МГц тон между -50Mhz и 50Mhz. Значение развертки должно составлять от 350 МГц до 450 МГц. Но это не так. Не понимаю, в чем причина этого. Было высказано предположение, что это связано с тем, что частота является производной фазы. Я дал этот выстрел тоже в комментариях в функции "sweep_sine", но это тоже не помогает. Любая помощь будет оценена по достоинству.

Добавлено изображение неожиданного выхода программы. Как вы можете видеть, я могу сдвинуть свой 400-мегагерцовый тон до 300 МГц. Когда я пытаюсь подметать в моде, подобном сдвигу; выход неправильный, так как в нем не выполняется с 350 МГц до 450 МГц с тоном 400 МГц в середине.

Теперь я могу правильно измерить сигнал, как видно на изображении 2. Сигнал временной области также выглядит хорошо, когда сигнал имеет форму e ^ i2 *. Но когда я использую реальный сигнал формы sin (2 * pift), версия временной области выглядит искаженной (изображение 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])
Теги:
numpy
fft
signal-processing
complex-numbers

2 ответа

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()

Он производит более или менее ок-спектрограмму и не искажает полученный сигнал. Надеюсь, поможет.

0

Вы совершили очень распространенную ошибку. Увеличение частоты и времени (при умножении их на создание входного параметра фазы для функции exp или sine) на каждом временном шаге слишком увеличивает частоту. Вместо этого выясните, сколько фаз должно измениться на каждом новом временном шаге для желаемой частоты на этом временном шаге и добавьте эту фазовую дельта вместо того, чтобы делать умножение, чтобы получить новый вход фазы в вашу синусоидальную или функцию exp.

  • 0
    Что если сигнал не является тоном (синусоидой)? Будет ли работать дополнительный этап?
  • 0
    Если сигнал является периодическим и может быть проиндексирован или параметризован по фазе

Ещё вопросы

Сообщество Overcoder
Наверх
Меню