You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FSK调制Matlab代码异常:相位不连续等问题求解

解决FSK调制中的相位不连续与幅值异常问题

问题原因分析

  • 相位不连续:原代码直接通过cos(2π(fc + 2y df)t)计算调制信号,当TTL电平切换时载波频率突变,但相位基于全局时间t直接计算,前后相位无衔接,导致跳变。
  • 幅值异常:square函数的采样精度问题可能在跳变点引入非0/1的过渡值,再加上相位跳变带来的视觉波动,最终呈现幅值不一致的现象。

修改后的代码

f = 30;          % TTL信号频率
fc = 400;        % 载波中心频率
df = 20;         % 频率偏移量
num_cycles = 10; % 生成10个TTL周期
fs = 10000;      % 采样频率(远高于载波频率,保证精度)

T = 1/f;
t_total = num_cycles * T;
t = linspace(0, t_total, round(fs * t_total));

% 生成严格的TTL方波(确保每个采样点为0或1)
y = zeros(size(t));
for i = 1:length(t)
    cycle_pos = mod(t(i), T);
    y(i) = cycle_pos < T/2 ? 1 : 0; % 前半周期为1,后半为0
end

% 计算FSK调制信号(相位累积法保证连续)
phase = 0;
y_m = zeros(size(t));
freq_step = 2 * pi * (fc + 2*y*df); % 每个采样点的角频率
for i = 1:length(t)
    if i == 1
        phase = freq_step(i) * t(i);
    else
        dt = t(i) - t(i-1);
        phase = phase + freq_step(i) * dt; % 累积相位增量
    end
    y_m(i) = cos(phase);
end

% 绘图
figure;
subplot(2,1,1);
plot(t, y);
title('TTL方波信号');
xlabel('时间(s)');
ylabel('电平');
ylim([-0.1, 1.1]);

subplot(2,1,2);
plot(t, y_m);
title('连续相位FSK调制信号');
xlabel('时间(s)');
ylabel('幅值');
ylim([-1.1, 1.1]);

关键修改说明

  • 精确生成TTL方波:替代square函数,通过判断采样点在周期内的位置生成严格0/1电平,避免过渡值问题。
  • 相位累积法:不再用全局时间直接计算相位,而是累加每个采样间隔的相位增量,确保频率切换时相位平滑衔接,彻底解决相位不连续。
  • 提高采样频率:设置10kHz采样频率,远高于载波频率,保证调制信号采样精度,消除视觉上的幅值波动。

内容的提问来源于stack exchange,提问作者Phillip A. Hendrick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 06:09:23