1.简介:
调制:把基带信号,也就是包含传输信息的有效信号加载到某个载波(通常为高频的正弦或余弦波)的过程称为调制,得到的信号称为已调信号。调制是指载波信号在基带信号的作用下发生改变,包含信息的基带信号加载在载波上,即载波受基带信号的调制。
解调:是调制的逆过程,就是通过某种信号处理手段从已调信号中得到原始包含传输信息的有效信号。
2.调制的优点:
-
调制能实现信号的频谱转移,从低频信号搬移到高频处,这样也就扩大了基带有效信号的频谱范围;
-
低频频带窄,都用低频传输,会造成堵塞,调制能够扩宽传输频带,提高了频率利用率;
-
调制能够将多路基带信号加载到频率不同的载波上,完成信号的频率分配,使多路信号互不干扰地在同一个信道上传输,实现频分复用;
-
调制还可以减弱噪声和降低干扰。
3.信号调制——调幅(AM)
3.1 双边带幅度调制(DSB-AM)与解调
1.假设基带信号为,即幅度为A,初始相位为0,频率为;载波信号为幅度B,初始相位为0,频率为的余弦信号,其中远大于。基带信号乘以载波信号进行调制,得到调制后的信号:
2.信号做完调制后,基带信号就转到了频率为附近,对于基带信号与载波信号直接相乘的调制方式称为双边带幅度调制。然后继续将调制后的信号乘以载波信号进行解调,得到解调信号:。为了得到原来的基带信号,只需要用低通滤波过滤掉的信号,再乘以,就得到原始信号了。
3.2 单边带幅度调制(SSB-AM)与解调
从已调信号F中获得某一边带的信号,有两种方法,分别是滤波法和相移法。
滤波法:调制后的信号频率在附近,你需要哪一段就设置滤波器把另一半滤掉就好。
相移法:单边调制信号为:
单边解调信号为:,要想得到基带信号,需要做一个低通滤波,再乘以 ,得到基带信号。
注:为基带信号的希尔伯特变换。
4.案例分析
1.画出一个周期的矩形波,周期为10,振幅为2的基带信号。
2. 令载波是一频率为100 Hz,振幅为1,初相为0的余弦波。
3.查看基带信号与已调信号的归一化频谱的对比。
4.还原基带信号。
5. python程序。
import numpy as np
import scipy.fftpack as fftp
import matplotlib as mpl
import matplotlib.pyplot as plt
import scipy.signal as signalP
mpl.rcParams['font.sans-serif'] = ['KaiTi'] # 保证正常显示中文
mpl.rcParams['font.serif'] = ['KaiTi'] # 保证正常显示中文
mpl.rcParams['axes.unicode_minus'] = False # 保证负号正常显示
def butter_lowpass_filtfilt(data, cutoff, fs, order=5):
"""
对信号作低通滤波
:param data: 输入信号
:param cutoff: 通带截至频率
:param fs: 采样频率
:param order: 滤波器的阶数
:return: 返回值为y,经低通滤波后的信号
"""
b, a = signalP.butter(5, cutoff/fs*2, btype='low')
shape = data.shape
if shape[0] != 1:
data = data.T
y = signalP.filtfilt(b, a, data)
y =y.T
return y
dt = 0.001 # 时间域采样间隔
Fs = 1/dt # 采样率
T = 10 # 矩形波的周期
nT = 10 # 总的周期数
nPT = int(T/dt+0.5) # 每个周期的样点数
n = nT*nPT # 总样点数
alpha = 0.5 # 矩形波的占空比
t = np.arange(dt, n*dt+dt, dt)
f = np.zeros((n, 1), dtype=np.float64)
A = 2
for i in range(0, nT, 1):
f[(i+1)*nPT-int(alpha*nPT):(i+1)*nPT] = A # 得到矩形波
fc = 100 # 载波的频率
g1 = np.cos(2*np.pi*fc*t).reshape(n, 1)
g2 = np.sin(2*np.pi*fc*t).reshape(n, 1)
hf = fftp.hilbert(f.reshape(n, )) # 矩形波的希尔伯特变换
s = 0.5*f*g1-0.5*hf.reshape(n, 1)*g2 # 已调信号
s_dm = s*g1 # 解调
cutoff = 60 # 截至频率
order = 6 # 滤波器的阶数
s_dm = 4*butter_lowpass_filtfilt(s_dm, cutoff, Fs, order) # 作低通滤波
f_spec = np.fft.fft(f, n, 0) # 作傅立叶变换
freq = np.fft.fftfreq(n, dt).reshape(n, 1) # 得到每点的频率
f_spec_amp = abs(f_spec)/(n/2) # 对频谱的振幅作归一化
f_spec_amp[0] = f_spec_amp[0]/2
f_spec_amp[int(n/2)+1] = f_spec_amp[int(n/2)+1]/2
s_spec = np.fft.fft(s, n, 0)
s_spec_amp = abs(s_spec)/(n/2)
s_spec_amp[0] = s_spec_amp[0]/2
s_spec_amp[int(n/2)+1] = s_spec_amp[int(n/2)+1]/2
# 绘制一个周期内的矩形波
plt.figure(num=1)
plt.plot(t[0:nPT], f[0:nPT], 'b-')
plt.xlim(0, T)
plt.ylim(-3, 3)
plt.xlabel('时间/(s)')
plt.ylabel('振幅')
plt.title('一个周期内的矩形波信号')
plt.savefig('图1.jpg', dpi=600)
plt.show()
# 绘制已调信号
plt.figure(num=2)
plt.plot(t[0:int(10/fc/dt+0.5)], s[0:int(10/fc/dt+0.5)], 'b-')
plt.xlim(0, 10/fc)
plt.ylim(-3, 3)
plt.xlabel('时间/(s)')
plt.ylabel('振幅')
plt.title('已调信号')
plt.savefig('图2.jpg')
plt.show()
# 绘制基带信号与已调信号的频谱
plt.figure(num=3)
plt.plot(freq, f_spec_amp, 'b-', freq, s_spec_amp, 'r-')
plt.xlim(min(freq), max(freq))
plt.legend(('基带信号的频谱', '已调信号的频谱'), loc='upper right')
plt.xlabel('频率/(Hz)')
plt.ylabel('振幅')
plt.title('基带信号和已调信号的归一化频谱')
plt.savefig('图3.jpg')
plt.show()
# 绘制基带信号与解调信号
plt.figure(num=4)
plt.plot(t[0:nPT], f[0:nPT], 'k-', t[0:nPT], s_dm[0:nPT], 'r-')
plt.legend(('基带信号', '解调信号'), loc='upper right')
plt.xlim(0, T)
plt.ylim(-3, 3)
plt.xlabel('时间/(s)')
plt.ylabel('振幅')
plt.title('基带信号和解调信号')
plt.savefig('图4.jpg')
plt.show()