Python - generování pulzní modulace

Všetko to čo sa inde nehodí

Moderátori: psichac, Moderátori

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1538
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Python - generování pulzní modulace

Príspevok od používateľa jirka.jirka. » 23 Aug 2021, 17:29

Zdravím pánové,

bojuji s pythonem a pokouším se generovat pulzní modulaci a vykreslit to v grafu.

Něco jsem se s internetem pokusil udělat, ale výsledek je nula. Parametry, které se budou nastavovat:
Fc - nosná frekvence
PW - šířka pulsu
PRI - opakovačka (Pulse Repitition Period)
main-qimg-439a33619a4d8158c4298a0a33134d01-c.jpeg
Konkrétně bych potřeboval pomocí těchto 3 parametrů vygenerovat IQ vzorky, které se pokusím nahrát do pokusného SDR-ka ke generování mého signálu. Ale ohledně tohoto jsem teprve v plenkách.

Zde je nějaký kód, co jsem vyhrabal pomocí google, ale ne a ne jej adekvátně upravit. Např. při pokusu o odstranění noise se mi to celé rozrýpe.

Kód: Vybrať všetko

import time
import sys

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

freq = 1000000
fs = int(2*freq) # sample rate
x = np.linspace(0, 20, fs)


noise1 = 0.01*np.sin(2*np.pi * 1*x) + 0.05*np.sin(2*np.pi * 1.5*x) + 0.04*np.sin(2*np.pi * 0.2*x)
noise2 = 0.1*np.sin(2*np.pi * 0.1*x) + 0.2*np.sin(2*np.pi * 1.8*x) + 0.1*np.sin(2*np.pi * 0.4*x)

realSignal = 2*np.sin(2*np.pi * freq*x)

sig =  noise1
sig = np.append(sig, [realSignal, noise1*noise2, realSignal, noise1*noise2])

plt.plot(sig)
plt.show()
Vysledek.PNG
Tak třeba někdo poradí. Děkuji
0

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1538
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: Python - generování pulzní modulace

Príspevok od používateľa jirka.jirka. » 23 Aug 2021, 17:59

Tady se mi podařilo vygenerovat vlastní průběh:

Kód: Vybrať všetko

import time
import sys

import matplotlib.pyplot as plt
import numpy as np
from scipy import signal
import sk_dsp_comm.sigsys as ss
from IPython.display import Image, SVG

fs = 100 # sampling rate in Hz
tau = 1
t = np.arange(-5,5,1/fs)
x3 = ss.rect(t-.5,tau)
y = x3*np.cos(2*np.pi*10*t)

plt.subplot(211)
plt.plot(t,x3)
plt.plot(t,y)
plt.grid()
plt.ylim([-1.1,1.1])
plt.xlim([-2,2])
plt.show()
Ale teď otázka, jak zakomponovat moje požadavky. Tzn. nosnou, PRI, PW.

output.PNG
0

maskrtnik01
Ultimate člen
Ultimate člen
Príspevky: 2566
Dátum registrácie: 20 Júl 2010, 00:00
Bydlisko: okolie KE
Vek: 27

Re: Python - generování pulzní modulace

Príspevok od používateľa maskrtnik01 » 23 Aug 2021, 18:34

Ja by som na to išiel takto.

Spravil by som si signál nosnej frekvencie, čiže sínus Fc.
Ďalej signál obálky, tam hranatý signál s Ton=PW, Tperiod=PRI. Počas pulzu by mal obdĺžnik hodnotu 1, inde 0.
Keď sa to prenásobí, malo by vyjsť čo požadujete.

Sínus už je vidno v zdrojových kódoch. Na obdĺžnik som našiel https://docs.scipy.org/doc/scipy/refere ... quare.html .
0

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1538
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: Python - generování pulzní modulace

Príspevok od používateľa jirka.jirka. » 23 Aug 2021, 19:07

Nápad pěkný.

Takže pokrok. Zde jsou funkce v základu pro generování obdélníku a sinu.

Kód: Vybrať všetko

freq_sine = 2500000  # freq in Hz
freq_square = 2000000 # freq in Hz

from scipy import signal
import matplotlib.pyplot as plt
t = np.linspace(0, 0.000005, freq_square*2, endpoint=False)
plt.plot(t, signal.square(2 * np.pi * freq_square * t))
plt.ylim(-2, 2)
plt.show()


t = np.linspace(0, 0.000005, freq_sine*2, endpoint=False)
fs = int(2*freq) # sample rate
sine_wave = 2*np.sin(2*np.pi * freq_sine*t)
plt.plot(sine_wave)
plt.show()
0

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1538
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: Python - generování pulzní modulace

Príspevok od používateľa jirka.jirka. » 23 Aug 2021, 19:35

Takže mám dvě funkce, sinus a obdélník.

Výstupy jsou: square_wave a sine_wave. Ale už nevím, jak data zkombinovat. Nějaký nápad?

Kód: Vybrať všetko

from scipy import signal
import matplotlib.pyplot as plt

freq_sine = 2500000  # freq in Hz
freq_square = 2000000 # freq in Hz
t = np.linspace(0, 0.000005, freq_square*2, endpoint=False)
square_wave = signal.square(2 * np.pi * freq_square * t)
plt.plot(square_wave )
plt.ylim(-2, 2)
plt.show()


t = np.linspace(0, 0.000005, freq_sine*2, endpoint=False)
fs = int(2*freq) # sample rate
sine_wave = 2*np.sin(2*np.pi * freq_sine*t)
plt.plot(sine_wave)
plt.show()

Já zkoušel data zkombinovat tak nějak říkajíc laicky:

Kód: Vybrať všetko

for x in square_wave:
    output_wave[x] = sine_wave[x]*square_wave[x]
    
plt.plot(output_wave)
plt.show()
Ale výstup je chybný:
  • File "D:\pulse_modulation.py", line 66, in <module>
    output_wave[x] = sine_wave[x]*square_wave[x]
    IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices
0

maskrtnik01
Ultimate člen
Ultimate člen
Príspevky: 2566
Dátum registrácie: 20 Júl 2010, 00:00
Bydlisko: okolie KE
Vek: 27

Re: Python - generování pulzní modulace

Príspevok od používateľa maskrtnik01 » 23 Aug 2021, 19:47

Na to by aj mohla byť vstavaná funkcia, aj keď mne sa nepodarilo nájsť.

Každopádne, aj takto by to malo ísť. Máte tam ale syntaktickú chybu.

Je tam, pre každé x z square_wave, a následne x-kom indexujete signály (v iných jazykoch známe ako for each cyklus). For cyklus sa v pythone píše for i in range(max). Treba ešte zistiť(resp. vedieť) koľko vzoriek majú tie signály, to pôjde ako argument do range.
0

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1538
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: Python - generování pulzní modulace

Príspevok od používateľa jirka.jirka. » 23 Aug 2021, 20:05

Vypadá to snadno, ale opak je pravdou. Zkusil jsem to vyřešit takto:

Kód: Vybrať všetko

output_wave = []
for i in range(len(square_wave)):
    output_wave[i] = sine_wave[i]*square_wave[i]
    
plt.plot(output_wave)
plt.show()
Ale chyba se změnila:
  • File "D:\pulse_modulation.py", line 68, in <module>
    output_wave = sine_wave*square_wave
    IndexError: list assignment index out of range


Edit:
Zde se mi podařilo něco najít, ale nic moc to neudělalo. Ten krom toho, že to generuje chybu, ale program vytuhne:

Kód: Vybrať všetko

output_wave = square_wave[0]
for i in range(1, len(square_wave)):
    output_wave = np.vstack([output_wave,square_wave[i]])
    
plt.plot(output_wave)
plt.show()
0

maskrtnik01
Ultimate člen
Ultimate člen
Príspevky: 2566
Dátum registrácie: 20 Júl 2010, 00:00
Bydlisko: okolie KE
Vek: 27

Re: Python - generování pulzní modulace

Príspevok od používateľa maskrtnik01 » 23 Aug 2021, 20:26

K tomu prvému. Samozrejme, že keď output_wave je prázdny zoznam, tak s tými indexami sa dostanete mimo rozsah. Treba ho inicializovať ako len(square_wave) núl.

https://numpy.org/doc/stable/reference/ ... _like.html
0

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1538
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: Python - generování pulzní modulace

Príspevok od používateľa jirka.jirka. » 24 Aug 2021, 08:25

Kód: Vybrať všetko

output_wave = []
for i in range(len(square_wave)):
	output_wave.append(square_wave[i]*sine_wave[i])

plt.plot(output_wave)
plt.show()
Chtělo si to zdřímnout. :rolleyes: Kostru mám, můžu pokračovat. :thumbup:
0

Napísať odpoveď