Перед вами обучающий материал по основам цифровой обработки сигналов с использованием средств языка программирования Python. Предполагается, что читатель имеет базовые знания из области высшей математики, а также владеет языком Python и хотя бы поверхностно знает различные python-библиотеки - numpy/scipy, matplotlib и другие.
Для пользователей MATLAB / GNU Octave освоение материала с точки зрения программного кода не составит труда, поскольку основные функции и их атрибуты во многом идентичны и схожи с методами из python-библиотек.
import numpy as np
import matplotlib.pyplot as plt
from scipy.fftpack import fft, rfft, fftshift
FONT_SMALL = 12
FONT_MEDIUM = 14
plt.rc('axes', titlesize=FONT_MEDIUM)
plt.rc('axes', labelsize=FONT_SMALL)
plt.rc('xtick', labelsize=FONT_SMALL)
plt.rc('ytick', labelsize=FONT_SMALL)
plt.rc('legend', fontsize=FONT_MEDIUM)
plt.rc('figure', titlesize=FONT_MEDIUM)
%matplotlib inline
В мире существует множество сигналов различной формы, однако в задачах цифровой и аналоговой обработки часто используются известные сигналы - гармонической формы, модулированные (по амплитуде, частоте или фазе). Как известно, сигнал любой формы можно представить как совокупность гармонических сигналов разных частот и амплитуд (то есть набор спектральных отсчетов). Можно сказать, что чем сложнее сигнал - тем больше спектральных отсчетов требуется для его представления. В частности, для представления сигналов с резкими изменениями формы требуются высокие частоты спектра, а для "гладких" сигналов и медленно меняющихся процессов высокие частоты не требуются и не вносят вклад в результирующий сигнал (и его спектр).
Гармонический сигнал задается уравнением:
$$ s(t) = A \cdot cos(2\pi ft +\phi) \tag{5.1}$$где A – амплитуда колебания, f - частота сигнала, φ – начальная фаза.
Комплексная запись такого сигнала:
$$ s = A \cdot e^{j(2\pi ft +\phi)} \tag{5.2}$$где j - комплексная единица. Часто выражается как $j = \sqrt-1$
Ниже представлен график гармонического сигнала при различных параметрах значения частоты. Амплитуда = 1, начальная фаза = 0 (константы).
n = 100
t = np.linspace(0, 1, n, endpoint=True)
# list of frequencies
f_list = np.array([1, 2, 3, 5, 8, 10, 15, 20, 30])
plt.figure(figsize=(16, 10), dpi=100)
for i, freq in enumerate(f_list):
plt.subplot(3, 3, i+1)
plt.plot(t, np.sin(2*np.pi*freq*t))
plt.title(f'Frequency = {freq}')
plt.xlabel('Samples')
plt.ylabel('Amplitude')
plt.xlim([0, 1])
plt.xticks(np.linspace(0, 1, 11, endpoint=True))
plt.grid()
plt.tight_layout()
Несмотря на то, что модуляция присуща аналоговым колебаниям, необходимо понимать, какими способами можно передавать информационные сообщения. Для цифровых сигналов модуляция дискретными колебаниями называется манипуляция и также будет рассмотрена в этом разделе.
Модуляцией называется процесс изменения одного или нескольких параметров сигнала. Модулируемый сигнал называется "несущим" (на частоте этого сигнала передается модулируемое сообщение). Информационный сигнал называется модулирующим. Как правило, модулирующий сигнал - низкочастотный, а несущий сигнал - высокочастотный. В процессе модуляции несущего сигнала спектр модулирующего сигнала переносится в область несущей частоты. Гармонические сигналы можно модулировать во времени по амплитуде, частоте и фазе.
Передача электромагнитного поля в пространстве выполняется с помощью антенн, размер которых зависит от длины волны $\lambda$, низкочастотные информационные сигналы во многих случаях просто физически невозможно передать от источника к получателю (требуются антенны огромных размеров). В связи с этим применяются методы модуляции высокочастотных несущих колебаний.
Амплитудная модуляция - широко известный способ изменения формы сигнала по параметру амплитуды. Из названия очевидно, что амплитуда такого сигнала изменяется во времени. Закон изменения амплитуды - произвольный, на практике часто используется модуляция гармоническим колебанием.
Формула простейшего гармонического АМ-сигнала:
$$ s(t) = A_c \cdot (1 + m \cdot cos(\omega_mt +\phi)) \cdot cos(\omega_сt) \tag{5.3}$$где
Тогда, радиосигнал состоит из несущего колебания и двух боковых полос. Из названия, очевидно, что несущая частота - та, на которой распространяется сигнал. Как правило, это высокая частота относительно модулирующей частоты.
Модулирующая частота, в свою очередь, низкочастотная. Это такая частота, на которой передается информационное сообщение.
Для синусоидального сигнала, использованного в качестве примера боковые полосы представляют собой синусоидальные сигналы и их частоты равны $\omega_{c}+\omega_{m}$ и $\omega_{c}-\omega_{m}$. Спектр АМ-сигнала всегда симметричен относительно центральной (несущей) частоты.
Важно понимать, что центральная частота не несет полезной информации, хоть и называется "несущая". В это понятие вкладывается значение частоты, относительно которого располагаются информационные (модулирующие) частоты сигнала.
Создадим функцию АМ-сигнала:
def signal_am(amp=1.0, km=0.25, fc=10.0, fs=2.0, period=100):
"""
Create Amplitude modulation (AM) signal
Parameters
----------
amp : float
Signal magnitude
km : float
Modulation coeff: amplitude sensitivity 0 <= km < 1
fc : float
Carrier frequency
fs : float
Signal frequency
period : integer
Number of points for signal (same as period)
"""
tt = 2.0 * np.pi * np.linspace(0, 1, period)
return amp * (1 + km * np.cos(fs * tt)) * np.cos(fc * tt)
На приведенных ниже графиках показано, как меняется форма и спектр АМ-сигнала при изменении параметра несущей частоты $f_c$:
Как видно, спектр АМ-сигнала состоит из трех компонент: центральная - несущая, и две боковые - модулирующие. При изменении несущей частоты происходит смещение всего АМ-сигнала по частоте.
N = 1024
# Create AM-signal
fs = 15 # Modulation frequency
fc = [20, 45, 60] # Carrier frequency
sig = [signal_am(amp=1.0, km=0.45, fc=i, fs=fs, period=N) for i in fc]
# Calculate FFT
sft = np.abs(rfft(sig, axis=1)) / N / 0.5
plt.figure(figsize=(16, 8))
for i, freq in enumerate(fc):
plt.subplot(len(fc), 2, 2*i+1)
if i == 0:
plt.title('AM-signal')
plt.plot(sig[i])
plt.xlim([0, N-1])
plt.grid(True)
plt.subplot(len(fc), 2, 2*i+2)
if i == 0:
plt.title('Spectrum')
plt.plot(sft[i])
plt.xlim([0, N//2-1])
plt.grid(True)
plt.tight_layout()
На приведенных ниже графиках показано, как меняется форма и спектр АМ-сигнала при изменении параметра частоты модулирующего колебания $f_s$:
Как видно, при изменении модулирующей частоты, спектр не сдвигается, но изменяется расстояние между центральной (несущей) частотой и боковыми (модулирующими) частотами.
Ширина спектра АМ сигнала равна удвоенной частоте модулирующего сигнала.
N = 1024
# Create AM-signal
fs = [5, 12, 23] # Modulation frequency
fс = 60 # Carrier frequency
sig = [signal_am(amp=1.0, km=0.45, fc=fс, fs=i, period=N) for i in fs]
# Calculate FFT
sft = np.abs(rfft(sig, axis=1)) / N / 0.5
plt.figure(figsize=(16, 8))
for i, freq in enumerate(fs):
plt.subplot(len(fc), 2, 2*i+1)
if i == 0:
plt.title('AM-signal')
plt.plot(sig[i])
plt.xlim([0, N-1])
plt.grid(True)
plt.subplot(len(fs), 2, 2*i+2)
if i == 0:
plt.title('Spectrum')
plt.plot(sft[i])
plt.xlim([0, N//2-1])
plt.grid(True)
plt.tight_layout()
Наконец, посмотрим, как меняется форма и спектр АМ-сигнала при изменении параметра коэффициента модуляции $k_m$:
Как видно, при изменении коэффициента модуляции, спектр сигнала остается на месте. Меняется только уровень боковых составляющих. Заметим, что при $k_m > 1$ возникает так называемая избыточная модуляция (перемодуляция). Максимальное значение коэффициента модуляции, при котором не возникает перемодуляции АМ-сигнала $k_m = 1$.
Амплитуда центральной гармоники равна амплитуде несущего колебания: $A_c = A_o$.
Амплитуда боковых составляющих равна $$ A_m = \frac{A_o\cdot m}{2} \tag{5.4}$$
N = 1024
# Create AM-signal
fs = 6 # Modulation frequency
fс = 40 # Carrier frequency
km = [0.35, 0.85, 5] # modulation coeff.
sig = [signal_am(amp=1.0, km=i, fc=fс, fs=fs, period=N) for i in km]
# Calculate FFT
sft = np.abs(rfft(sig, axis=1)) / N / 0.5
plt.figure(figsize=(16, 8))
for i, freq in enumerate(km):
plt.subplot(len(km), 2, 2*i+1)
if i == 0:
plt.title('AM-signal')
plt.plot(sig[i])
plt.xlim([0, N-1])
plt.grid(True)
plt.subplot(len(km), 2, 2*i+2)
if i == 0:
plt.title('Spectrum')
plt.plot(sft[i])
plt.xlim([0, N//2-1])
plt.grid(True)
plt.tight_layout()
Среди класса сигналов с амплитудной модуляцией есть ряд сигналов, которые лучше используют энергетические характеристики сигнала. Например, сигналы с подавленной несущей (балансная модуляция) относятся к классу АМ-сигналов, и позволяют производить передачу сообщений более экономно в плане энергетических спектральных характеристик. Также есть амплитудная модуляция с одной боковой полосой (single-sideband modulation, SSB), нашедшая применение в профессиональной и любительской радиосвязи. В свою очередь, модуляция с одной боковой полосой разделяется на модуляцию с верхней (upper sideband, USB) и нижней боковой полосой (lower sideband, LSB). ____
Под термином угловая модуляция понимается модуляция по фазе или по частоте (математически можно представить, что изменяется "угол" тригонометрической функции). Таким образом, сигналы с угловой модуляцией делятся на частотно-модулированные (ЧМ) сигналы и фазо-модулированные (ФМ) сигналы.
При фазовой модуляции значение угла фазы изменяется пропорционально информационному сообщению, при частотной модуляции информационный сигнал управляет частотой несущего колебания. В обоих случаях амплитуда сигнала остается неизменной.
Сигналы с угловой модуляцией применяются в музыкальных синтезаторах, в телевещании для передачи звука и сигнала цветности, а также для качественной передачи звуковых сообщений (например, радиовещание в УКВ диапазоне). Высокое качество в сравнении с АМ-сигналами достигается за счет лучшего использования частотного диапазона передаваемого сообщения. Иными словами, в полосе сигнала укладывается больше информации, чем в сигналах с АМ-модуляцией. Кроме того, информационное сообщение сигналов с угловой модуляцией менее подвержено серьёзному влиянию окружающей среды при передаче, поскольку информация содержится не в амплитуде. Очевидно, что в процессе распространения сигнал чаще претерпевает изменения амплитуды, чем изменения фазы или частоты.
Формула сигнала с угловой модуляцией:
$$ s(t) = A \cdot cos(2\pi f_c t + k u_{m}(t)) \tag{5.5}$$В случае модуляции гармоническим колебанием:
$$ s(t) = A_c \cdot cos(2\pi f_c t + \frac{A_{m} f_{\Delta}}{f_{m}} sin(2\pi f_s t)) \tag{5.6}$$где
Отношение девиации частоты к частоте модулирующего колебания называют индексом частотной модуляции. Как и в случае с АМ-колебанием, модулирующая частота - низкочастотная относительно частоты несущей.
Создадим упрощенную python-функцию ЧМ-сигнала:
def signal_fm(amp=1.0, kd=0.25, fc=10.0, fs=2.0, period=100):
"""
Create Frequency modulation (FM) signal
Parameters
----------
amp : float
Signal magnitude
kd : float
Frequency deviation, kd < period/4,
e.g. fc = 0, fs = 1, kd = 16
fc : float
Carrier frequency
fs : float
Signal frequency
period : integer
Number of points for signal (same as period)
"""
tt = 2.0 * np.pi * np.linspace(0, 1, period)
return amp * np.cos(fc * tt + kd/fs * np.sin(fs * tt))
Построим сигналы с частотной модуляцией в зависимости от значения девиации частоты:
N = 1024
fs = 5 # Modulation frequency
fс = 65 # Carrier frequency
kd = [3, 23, 40] # modulation coeff.
sig = [signal_fm(amp=1.0, kd=i, fc=fс, fs=fs, period=N) for i in kd]
# Calculate FFT
sft = np.abs(fft(sig, axis=1))
plt.figure(figsize=(16, 8))
for i, freq in enumerate(kd):
plt.subplot(len(kd), 2, 2*i+1)
if i == 0:
plt.title('FM-signal')
plt.plot(sig[i])
plt.xlim([0, N//2-1])
plt.grid(True)
plt.subplot(len(kd), 2, 2*i+2)
if i == 0:
plt.title('Spectrum')
plt.plot(sft[i])
plt.xlim([0, N//2-1])
plt.grid(True)
plt.tight_layout()
Модулирующий и частотно-модулированный сигналы
N = 512
sig = signal_fm(amp=1.0, kd=15, fc=40, fs=4, period=N)
smd = np.sin(4 * 2.0 * np.pi * np.linspace(0, 1, N))
plt.figure(figsize=(16, 5))
plt.subplot(2, 1, 1)
plt.title('Modulation signal')
plt.plot(smd)
plt.xlim([0, N//2-1])
plt.grid(True)
plt.subplot(2, 1, 2)
plt.title('FM-signal')
plt.plot(sig)
plt.xlim([0, N//2-1])
plt.grid(True)
Как видно, чем больше девиация по частоте, тем шире спектр сигнала с угловой модуляцией. ____
Сигналы с линейной частотной модуляцией (ЛЧМ) сигналы - это класс сигналов с частотной модуляцией, при которой частота несущего сигнала изменяется по линейному закону.
В задачах радиолокации часто требуется получить заданную разрешающую способность по дальности, определяемую как минимальное расстояние между двумя целями, при которой дальность до каждой из целей определяется раздельно. Эта величина обратно пропорциональна ширине спектра сигнала. Следовательно необходимо увеличивать ширину спектра для уменьшения значения разрешающей способности.
Увеличение ширины спектра сигнала можно достичь с помощью уменьшения длительности сигнала. Но это в свою очередь приводит к уменьшению энергии сигнала и дальности обнаружения. Компромиссное решение - использование сигналов сложной формы, в частности - ЛЧМ-сигналов.
Функция изменения частоты линейна:
$$ f(t) = f_{0} + k t \tag{5.7}$$где:
Основное применение ЛЧМ-сигналов - задачи радиолокации. Широкополосные ЛЧМ сигналы позволяют обеспечить высокую разрешающую способность по дальности без уменьшения длительности посылаемых (зондируемых) импульсов.
Основное понятие ЛЧМ сигнала - это база сигнала, которая характеризуется произведением ширины спектра и длительности импульса сигнала.
$$ \beta = \Delta f \cdot \tau \tag{5.8}$$Если база ЛЧМ сигнала $ \beta >> 1 $, то его спектр стремится к прямоугольному виду, а фазовый спектр имеет квадратичную зависимость от частоты. Известно, что при прохождении через согласованный фильтр происходит сжатие ЛЧМ-сигнала. Это в свою очередь порождает узкий корреляционный пик большой амплитуды.
Для сжатия ЛЧМ сигналов часто применяется операция быстрой свёртки, которая строится на базовых функциональных блоках цифровой обработки. Это ядра быстрого преобразования Фурье (БПФ), комплексные перемножители и блоки памяти, содержащие набор коэффициентов опорной функции.
Как видно, базовые операции цифровой обработки применимы и к задачам радиолокации.
ЛЧМ сигнал опишем формулой:
$$ s(t) = A cos(2\pi f_{0}t + \pi \beta t^{2}) \tag{5.9}$$где
Соответствующая функция на python:
def signal_chirp(amp=1.0, freq=0.0, beta=0.25, period=100, **kwargs):
"""
Create Chirp signal
Parameters
----------
amp : float
Signal magnitude
beta : float
Modulation bandwidth: beta < N for complex, beta < 0.5N for real
freq : float or int
Linear frequency of signal
period : integer
Number of points for signal (same as period)
kwargs : bool
Complex signal if is_complex = True
Modulated by half-sine wave if is_modsine = True
"""
is_complex = kwargs.get('is_complex', False)
is_modsine = kwargs.get('is_modsine', False)
t = np.linspace(0, 1, period)
tt = np.pi * (freq * t + beta * t ** 2)
if is_complex is True:
res = amp * (np.cos(tt) + 1j * np.sin(tt))
else:
res = amp * np.cos(tt)
if is_modsine is True:
return res * np.sin(np.pi * t)
return res
Построим график ЛЧМ-сигнала для разных значений параметра $\beta$. Как видно, при увеличении параметра, расширяется спектр сигнала.
N = 1024
beta = [25, 49, 157]
schirp = [signal_chirp(amp=1, freq=10, beta=i, period=N) for i in beta]
# Calculate FFT
sft = np.abs(fft(schirp, axis=1))
plt.figure(figsize=(16, 8))
for i, freq in enumerate(kd):
plt.subplot(len(kd), 2, 2*i+1)
if i == 0:
plt.title('Chirp')
plt.plot(schirp[i])
plt.xlim([0, N-1])
plt.grid(True)
plt.subplot(len(kd), 2, 2*i+2)
if i == 0:
plt.title('Spectrum')
plt.plot(sft[i])
plt.xlim([0, N//2-1])
plt.grid(True)
plt.tight_layout()
Зачастую ЛЧМ-импульсы дополнительно модулируются синусоидальной огибающей для достижения лучших спектральных характеристик. Также можно использовать комплексный ЛЧМ-сигнал.
N = 2048
beta = 88
schirp = signal_chirp(amp=1, freq=0, beta=beta, period=N, is_complex=True)
# Calculate FFT
sft = np.abs(fftshift(fft(schirp)))
plt.figure(figsize=(16, 4), dpi=80)
plt.subplot(1, 2, 1)
plt.title('Chirp')
plt.plot(np.real(schirp))
plt.plot(np.imag(schirp))
plt.plot(np.linspace(0, 1, N//2), '--', linewidth='2.5')
plt.xlim([0, N//2])
plt.grid(True)
plt.subplot(1, 2, 2)
plt.title('Spectrum')
plt.plot(sft)
plt.xlim([N//2-beta, N//2+2*beta])
plt.grid(True)
plt.tight_layout()
В теории передачи дискретных сообщений процесс преобразования битового потока в последовательность элементов сигнала называется цифровой модуляцией или манипуляцией. Иными словами, для дискретных (цифровых) систем процесс модуляции сигналов называется манипуляцией. Как и в случае с аналоговыми сигналами, цифровые гармонические последовательности могут быть манипулированы по амплитуде, фазе и частоте.
При низкочастотной модуляции (baseband modulation) эти сигналы имеют вид импульсов заданной формы. Для полосовой модуляции (bandpass modulation) импульсы заданной формы модулируют синусоиду, называемую несущей (carrier frequency).
Виды манипуляций:
Амплитудная манипуляция (Amplitude-shift keying, ASK) - преобразование сигнала, при котором скачкообразно меняется амплитуда несущего колебания. Наиболее распространена квадратурная амплитудная манипуляция высоких порядков (Quadrature amplitude modulation, QAM).
Частотная манипуляция (Frequency-shift keying, FSK) - преобразование сигнала, при котором скачкообразно меняется частота несущего сигнала в зависимости от значения цифрового сообщения.
Фазовая манипуляция (Phase-shift keying, PSK) - процесс преобразования сигнала, при котором скачкообразно изменяется фаза несущего колебания. Существует большой класс сигналов с фазовой манипуляцией: двоичная (BPSK, QPSK, 8-PSK и т.д.)
При квадратурной амплитудной манипуляции изменяется амплитуда и фаза сигнала. Это позволяет увеличить количество передаваемой информации. ДЛя представления манипулированных сигналов вводится понятие сигнального созвездия (constellation diagram). Оно представляет все возможные значения комплексной амплитуды манипулированного сигнала в виде точек на комплексной плоскости.
В идеале импульсы амплитудной манипуляции - прямоугольные, но на практике используются более гладкие импульсы в связи с тем, что для обеспечения строго прямоугольных модулирующих импульсов требуется недопустимо широкая полоса спектра сигнала.
Для обеспечения высокой скорости передачи и качественного уровня достоверности приёма использование сигналов только с амплитудной модуляцией - недостаточно. В связи с этим, на практике стали широко применяться сигналы с модуляцией по нескольким параметрам. Наиболее широкое распространение получили сигналы с амплитудно-фазовой манипуляцией, которые также квадратурным амплитудно-модулированными сигналами (КАМ). Они получаются путём комбинирования методов амплитудной и фазовой манипуляции, что позволяет увеличить количество передаваемых бит в одном символе, и повысить помехоустойчивость по сравнению с использованием только АМн или ФМн колебаний.
Ниже приведен пример простейшей амплитудной манипуляции гармонического сигнала. Последовательность символов задана с помощью генератора случайных чисел нулей и единиц.
N = 64
# Random array of ones and zeros
np.random.seed(6)
mod_rnd = np.random.randint(0, 2, 40)
# Repeat number of ones and zeros
mod_ask = np.repeat(mod_rnd, repeats=N)
# ASK signal
M = mod_ask.size
sig_ask = mod_ask * np.sin(64 * 2.0 * np.pi * np.linspace(0, 1, M))
# PLot results
plt.figure(figsize=(16, 6), dpi=80)
plt.subplot(2, 1, 1)
plt.title('Digital signal')
plt.plot(mod_ask, color='C0', linewidth=2.0)
plt.xlim([0, M-1])
plt.grid(True)
plt.subplot(2, 1, 2)
plt.title('ASK-signal')
plt.plot(mod_ask, '--', color='C0', linewidth=2.0)
plt.plot(sig_ask, '-', color='C1', linewidth=2.0)
plt.xlim([0, M-1])
plt.grid(True)
plt.tight_layout()
Для ЧМн сигналов варьируемым параметром выступает частота, причем амплитуда и начальная фаза остаются неизменными. Логическим уровням '0' и '1' ставятся в соответствие два значения частоты. Их выбирают из условия ортогональности на интервале длительности сигнала T.
Принцип формирования ЧМн сигналов достаточно прост. Есть несколько генераторов, формирующих колебания на разных частотах. Модулирующий цифровой сигнал переключает мультиплексор выбора сигнала с одного из генераторов. Таким образом, формируется посылка в виде сигналов разных частот. Например, для двоичной частотной манипуляции используется две частоты. Две позиции кодируются однобитовым числом: "0" соответствует частоте с первого генератора, "1" - частоте со второго генератора.
N = 200
# Random array of ones and zeros
np.random.seed(1)
mod_rnd = np.random.randint(0, 2, 20)
# Repeat number of ones and zeros
mod_fsk = np.repeat(mod_rnd, repeats=N)
# FSK signal
M = mod_fsk.size
mod_frq = np.zeros(M)
# Set freq 'bits' (0, 1)
mod_frq[mod_fsk == 0] = 10
mod_frq[mod_fsk == 1] = 50
sig_fsk = np.sin(mod_frq * 2.0 * np.pi * np.linspace(0, 1, M))
# PLot results
plt.figure(figsize=(16, 6), dpi=80)
plt.subplot(2, 1, 1)
plt.title('Digital signal')
plt.plot(mod_fsk, color='C0', linewidth=2.0)
plt.xlim([0, M-1])
plt.grid(True)
plt.subplot(2, 1, 2)
plt.title('FSK-signal')
plt.plot(mod_fsk, '--', color='C0', linewidth=2.0)
plt.plot(sig_fsk, '-', color='C1', linewidth=2.0)
plt.xlim([0, M-1])
plt.grid(True)
plt.tight_layout()
Для таких сигналов информационным параметром выступает фаза, причем для упрощения реализации цифровых систем значению логической '1' соответствует нулевая начальная фаза, а '0' – противоположное значение $\pi$ (для двухбитовой фазовой манипуляции). Передача логических уровней выполняется на одной несущей частоте. В литературе такие ФМн колебания часто называют ФМ-2 сигналами (BPSK, Binary phase-shift keying), где 2 означает количество вариаций фазы.
Следует отметить, что ФМ-2 сигналы не позволяют получить высокие скорости передачи информации по каналу связи с ограниченной полосой, но являются наиболее помехоустойчивыми к шумам. Простейший ФМ-2 сигнал не нашел практического применения из-за слишком широкой полосы и возможного случайного скачка фазы на $\pi$, что называется "режим обратной работы".
N = 200
# Random array of ones and zeros
np.random.seed(1)
mod_rnd = np.random.randint(0, 2, 25)
# Repeat number of ones and zeros
mod_psk = np.repeat(mod_rnd, repeats=N)
# PSK signal
M = mod_psk.size
sig_psk = np.sin(25 * 2.0 * np.pi * np.linspace(0, 1, M) + np.pi * mod_psk)
# PLot results
plt.figure(figsize=(12, 6), dpi=80)
plt.subplot(2, 1, 1)
plt.title('Digital signal')
plt.plot(mod_psk, color='C0', linewidth=2.0)
plt.xlim([0, M-1])
plt.grid(True)
plt.subplot(2, 1, 2)
plt.title('PSK-signal')
plt.plot(mod_psk, '--', color='C0', linewidth=1.5)
plt.plot(sig_psk, '-', color='C1', linewidth=2.0)
plt.xlim([0, M-1])
plt.grid(True)
plt.tight_layout()
Основной недостаток сигналов с однобитовой манипуляцией - нерациональное распределение энергии в частотном диапазоне. Из-за скачкообразного изменения варьируемых параметров на границах переходов символов, большая часть энергии содержится за пределами главного лепестка спектра, что приводит к внеполосному излучению.
Чтобы избежать этого, стали применяться сигналы с непрерывной фазой (СНФ). Существует три основных метода, с помощью которых строятся сигналы с относительно плавным изменением параметров сигнала на границах перехода: амплитудный, фазовый и комбинация из двух предыдущих – амплитудно-фазовый. Амплитудный метод позволяет уменьшить резкое изменение уровня сигнала в момент скачка фазы колебания до нуля. Фазовый метод исключает прыжки фазы, при которых наиболее вероятна ситуация ложного перехода. Амплитудно-фазовый метод сочетает в себе свойства двух предыдущих, причем амплитудный метод ограничивает логические уровни, сглаживая шумы, а фазовый предназначен для подавления боковых лепестков спектра.
Детальное исследование представленных выше сигналов, а также рассмотрение более сложных сигналов и видов модуляции и манипуляции выходит за рамки этого курса.