从 IQ 信号到 FM 调制载波,它是如何完成的?

信息处理 通用汽车
2022-02-24 03:02:17

我正在尝试理解 GMSK 调制/解调。IQ 样本是相位键控的一种方式,即在将它们乘以复数载波并将 I 和 Q 相加之后,就有了 FM 调制。我不明白它是如何完成的。我想它一定是三角函数,但有人能解释一下 IQ 的相位变化如何导致 HF 信号的频率变化吗?
提前致谢 时域中的 I 和 Q 样本
时域载体

2个回答

解决这个问题的方法是实现频率和相位之间的关系:

f(t)=dϕ(t)dt

在哪里f(t)是作为时间函数的瞬时频率,并且ϕ(t)是作为时间函数的瞬时相位。因此,根据这样的定义,相位的线性变化代表频率的阶跃变化。这正是我们可以将矢量调制器用作频率转换器(以及等效的单边带调制器)的方式。IQ 平面上的旋转相量,如果以恒定速率旋转,则表示取决于旋转方向的正频率或负频率。因此,使用 FSK 使用两个频率符号,我们得到正负旋转相量。实现的频率是该旋转的速率(周期/秒)。

从作为 FSK 的子集的 MSK 开始,特别是两个 FSK 音调之间的最小频移,以使两个信号正交,为此,我们在一个符号持续时间内将相位旋转 90°,以便旋转方向确定如果发送了 1 或 0。90° 的原因是这导致了两个频率音调的最小间距,如首先描述的(因此是 MSK)。如果我们在符号周期的同一时间内进一步旋转,这将导致更高的频率,从而增加音调之间的间距(如在广义 FSK 中)。下面显示了旋转与符号“1”或“0”的相位图。如果我们继续发送一长串任一符号,很明显我们正在发送正频率或负频率(相对于中心载波频率,

斯隆

当我们传输一系列符号时,从相位和频率之间的关系可以清楚地看出正在发生的频移键控:

斯隆

频率的急剧转变作为一个步骤是产生高频谱占用的原因(锐边会产生高频,考虑方波的所有频谱分量)。通过对这些边缘进行四舍五入,我们最大限度地减少了光谱占用,并且高斯最小移位键控专门用高斯滤波过渡替换了直线相位斜率;相位特别转换为集成的高斯脉冲(因此频率遵循高斯转换 - 见下图)。因此,相位在符号的开头缓慢开始,在中途达到最大速率,然后在结束时缓慢终止,否则可能会发生突然的方向变化。您可以制作一个非常简单的(没有乘法器,因此可以在微控制器中完成)GMSK 调制器,在频率控制字输入上使用高斯滤波器到 NCO,否则该 NCO 连接到数据流(类似地使用 VCO 在模拟世界)。(这实际上是我对这个问题的理解:最简单的全数字 GMSK 调制器,可与此解决方案结合用于简单的无乘法器高斯滤波器:无乘法器的高斯 FIR 滤波器?)。下面的 GMSK 相位和频率图进一步且最直接地显示了这是一种 FM 调制形式。

通用汽车

GMSK 也通常被实现为部分响应信号,其中我们将连续脉冲与故意的符号间干扰重叠,这些干扰随后可以完全撤消(例如,使用维特比解码),从而进一步提高频谱效率,因为我们可以发送更多相同数量的数据时间(以接收器复杂性为代价)。精彩的Laurent Decompositions的战略性使用显着简化了这些接收器——但这是另一天的话题。

此外,FSK、MSK、GMSK 都是恒定包络调制,因此具有明显的优势,即我们可以将发射机 PA 运行到饱和状态,从而提供显着的功率效率,并且不考虑对意图干扰的免疫力,可以硬限制输入而不是使用 AGC(两者对低成本电池供电设备特别感兴趣)

正如@Dan_Boschen 指出的那样,关键关系是频率,f(t), 是相位的时间导数,ϕ(t). 要生成最终的 FM 波形,实际上需要对频率变化进行积分以产生最终波形中使用的时变相位。

如果fmsg(t)是您的高斯脉冲形状的双极消息位系列(将消息表示为标准化频率偏差函数[1.0,1.0]),比特率为Rb,然后对于 MSK(调制指数12),以 0 Hz 的“载波”频率为中心的 GMSK 的 I/Q 为

s(t)=Aej2π0tRb/22fmsg(τ)dτ=Aejϕ(t)

调制到一个载波fcHz,表达式变为

s(t)=Aej(2πfct+2π0tRb/22fmsg(τ)dτ)=Aej(ωct+ϕ(t))

以下 Octave(MatLab 克隆)脚本介绍了在 IF 处将比特数字调制为 GMSK 信号的步骤:

% Keep Octave happy
pkg load signal;

% Bit rate
Rb = 9600;

% Modulation index; 1/2 is Minimum Shift Keying.
modulation_index = 1/2;

% GMSK specific parameters
BT = 0.4;
L = 3; % duration of pulse in symbols

% Optional frequency shift for demonstration of modulation on a
% carrier within -Fs/2 to +Fs/2
freq_shift_hz = 12.5e3;

% Samples per symbol and sample rate out of the modulation process
sps = 10;
Fs = Rb * sps;

% pulse filter taps
% Build Gaussian pulse filter
Ls = round(L*sps); % FIXME, code assumes even.
alpha = sqrt(2/log(2)) * pi * BT;
k = [(-Ls/2+1):1:(Ls/2-1)];
taps_pf = (erf(alpha*(k/sps + 0.5)) - erf(alpha*(k/sps - 0.5)))*0.5/sps;
K_pf = length(taps_pf);
if (mod(K_pf,2) == 0)
   delay_pf = K_pf/2;
else
   delay_pf = (K_pf-1)/2;
end

% Create a random bit string
nbits = 50;
message_bits = round(rand(nbits,1));
nrz_message_bits = (message_bits - 0.5)*2;

% Upsample and pulse shape the packet
% N.B. Octave's filter function sets up a history of 0's for us.
x = sps*[upsample(nrz_message_bits, sps); zeros(delay_pf+sps*3/2, 1)];
packet_baseband = filter(taps_pf, [1], x);

% Frequency modulate the baseband packet
fm_gain = pi/(Fs/2) * Rb/2 * modulation_index;
x = packet_baseband * fm_gain;
phase = cumsum(x); % phase is integral of frequency
packet_modulated = exp(1i*mod(phase, 2*pi));

% Perform a frequency shift (using a time varying complex exponential) 
radian_phase_inc = pi/(Fs/2) .* freq_shift_hz;
rotator = exp(1i*mod(radian_phase_inc * [0:(length(packet_modulated)-1)],2*pi));
packet_modulated_if = packet_modulated .* rotator.';

figure(1);
stem(message_bits);
title('Message Bits');
xlabel('Bit number');
ylabel('Value');
grid on;

figure(2);
N1 = length(packet_baseband);
t1 = [0:N1-1]/Fs;
plot(t1, packet_baseband * Rb/2 * modulation_index, 'x-');
title('Upsampled, Pulse Shaped, Scaled, and Level Shifted NRZ Bits');
xlabel('Time (seconds)');
ylabel('Frequency Deviation (Hz)');
grid on;

figure(3);
N2 = length(phase);
t2 = [0:N2-1]/Fs;
plot(t2, phase, '.-');
title('Accumulated Phase');
xlabel('Time (seconds)');
ylabel('Accumulated Phase (radians)');
grid on;

figure(4);
N = length(packet_modulated);
t = [0:N-1]/Fs;
plot(t, real(packet_modulated), t, imag(packet_modulated));
title('I & Q of GMSK Modulated Signal');
xlabel('Time (seconds)');
ylabel('Amplitude');
grid on;

figure(5);
N_if = length(packet_modulated_if);
t_if = [0:N_if-1]/Fs;
plot(t_if, real(packet_modulated_if), t_if, imag(packet_modulated_if));
title('I & Q of GMSK Modulated Signal at IF');
xlabel('Time (seconds)');
ylabel('Amplitude');
grid on;