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
相关产品推荐
相关产品推荐

