MATLAB代码来生成根升余弦滤波器,并绘制其时域和频域特性
2025-12-18
MATLAB代码来生成根升余弦滤波器,并绘制其时域和频域特性
根升余弦滤波器完整实现
%% 根升余弦滤波器生成与分析
clear all; close all; clc;
%% 参数设置
Fs = 1000; % 采样频率 (Hz)
T = 1; % 符号周期 (s)
sps = 10; % 每符号采样点数
beta = 0.5; % 滚降因子 (0~1)
filter_span = 6; % 滤波器跨度 (符号数)
%% 生成根升余弦滤波器
% 方法1: 使用rcosdesign函数 (推荐)
h_rc = rcosdesign(beta, filter_span, sps, 'sqrt');
% 方法2: 手动实现 (备用方法)
% t = (-filter_span*T/2 : 1/Fs : filter_span*T/2) + 1e-8; % 避免除零
% h_rc_manual = manual_root_raised_cosine(t, T, beta);
%% 时域分析
t_filter = (-filter_span*sps/2 : filter_span*sps/2) / (sps/T);
figure('Position', [100, 100, 1200, 800]);
% 时域波形
subplot(2,3,1);
stem(t_filter, h_rc, 'b', 'filled', 'MarkerSize', 4);
hold on;
plot(t_filter, h_rc, 'r-', 'LineWidth', 1.5);
grid on;
xlabel('时间 (符号周期)');
ylabel('幅度');
title('根升余弦滤波器时域响应');
legend('采样点', '包络', 'Location', 'best');
% 滤波器冲激响应细节
subplot(2,3,2);
plot(t_filter, h_rc, 'b-', 'LineWidth', 2);
grid on;
xlabel('时间 (符号周期)');
ylabel('幅度');
title('滤波器冲激响应');
xlim([-3, 3]);
% 眼图模拟
subplot(2,3,3);
% 生成随机数据并滤波
data = randi([0 1], 1, 100)*2 - 1; % BPSK信号
upsampled_data = upsample(data, sps);
tx_signal = conv(upsampled_data, h_rc, 'same');
% 绘制眼图
plot_eye_diagram(tx_signal, sps, 2);
title('发射信号眼图');
%% 频域分析
% 计算频率响应
N_fft = 1024;
H_rc = fftshift(fft(h_rc, N_fft));
f = (-N_fft/2 : N_fft/2-1) * (Fs / N_fft) / (1/T); % 归一化频率
% 幅度响应
subplot(2,3,4);
plot(f, 20*log10(abs(H_rc)/max(abs(H_rc))), 'b-', 'LineWidth', 2);
grid on;
xlabel('归一化频率 (fT)');
ylabel('幅度 (dB)');
title('根升余弦滤波器幅度响应');
xlim([-2, 2]);
ylim([-80, 5]);
% 相位响应
subplot(2,3,5);
phase_response = angle(H_rc);
phase_response_unwrapped = unwrap(phase_response);
plot(f, phase_response_unwrapped, 'r-', 'LineWidth', 2);
grid on;
xlabel('归一化频率 (fT)');
ylabel('相位 (弧度)');
title('相位响应');
xlim([-2, 2]);
% 群延迟
subplot(2,3,6);
group_delay = -diff(phase_response_unwrapped) ./ diff(f*2*pi);
plot(f(1:end-1), group_delay, 'g-', 'LineWidth', 2);
grid on;
xlabel('归一化频率 (fT)');
ylabel('群延迟 (样本)');
title('群延迟响应');
xlim([-2, 2]);
%% 不同滚降因子的比较
figure('Position', [100, 100, 1000, 600]);
beta_values = [0.2, 0.5, 0.8, 1.0];
colors = ['b', 'r', 'g', 'm'];
t_compare = (-filter_span*sps/2 : filter_span*sps/2) / (sps/T);
subplot(1,2,1);
hold on;
for i = 1:length(beta_values)
h_temp = rcosdesign(beta_values(i), filter_span, sps, 'sqrt');
plot(t_compare, h_temp, colors(i), 'LineWidth', 2, ...
'DisplayName', ['\beta = ', num2str(beta_values(i))]);
end
grid on;
xlabel('时间 (符号周期)');
ylabel('幅度');
title('不同滚降因子的时域响应');
legend('show');
xlim([-3, 3]);
subplot(1,2,2);
hold on;
for i = 1:length(beta_values)
h_temp = rcosdesign(beta_values(i), filter_span, sps, 'sqrt');
H_temp = fftshift(fft(h_temp, N_fft));
f_compare = (-N_fft/2 : N_fft/2-1) * (Fs / N_fft) / (1/T);
plot(f_compare, 20*log10(abs(H_temp)/max(abs(H_temp))), ...
colors(i), 'LineWidth', 2, ...
'DisplayName', ['\beta = ', num2str(beta_values(i))]);
end
grid on;
xlabel('归一化频率 (fT)');
ylabel('幅度 (dB)');
title('不同滚降因子的频域响应');
legend('show');
xlim([-2, 2]);
ylim([-80, 5]);
%% ISI性能分析
figure('Position', [100, 100, 800, 400]);
% 测试符号间干扰
test_symbols = [0, 0, 1, 0, 0]; % 单个脉冲
test_signal_upsampled = upsample(test_symbols, sps);
filtered_signal = conv(test_signal_upsampled, h_rc, 'same');
% 找到峰值位置
[~, peak_idx] = max(filtered_signal);
sampling_points = peak_idx:sps:length(filtered_signal);
subplot(1,2,1);
plot(filtered_signal, 'b-', 'LineWidth', 2);
hold on;
stem(sampling_points, filtered_signal(sampling_points), 'ro', 'filled');
grid on;
xlabel('采样点');
ylabel('幅度');
title('单个脉冲的滤波器响应');
legend('滤波器输出', '采样时刻');
% ISI分析 - 采样时刻的值
subplot(1,2,2);
isi_samples = filtered_signal(sampling_points);
stem(0:length(isi_samples)-1, isi_samples, 'b', 'filled');
hold on;
% 标记主瓣和旁瓣
plot([2,2], [0, max(isi_samples)], 'r--', 'LineWidth', 1.5);
text(2.2, max(isi_samples)*0.8, '主瓣', 'Color', 'r');
grid on;
xlabel('符号索引');
ylabel('幅度');
title('采样时刻的ISI分析');
%% 自定义函数定义
function plot_eye_diagram(signal, samples_per_symbol, num_eyes)
% 绘制眼图
eye_length = samples_per_symbol * num_eyes;
num_segments = floor(length(signal) / eye_length) - 1;
hold on;
for i = 1:num_segments
start_idx = (i-1) * eye_length + 1;
end_idx = start_idx + eye_length - 1;
segment = signal(start_idx:end_idx);
time_axis = (0:length(segment)-1) / samples_per_symbol;
plot(time_axis, segment, 'b-', 'LineWidth', 0.5);
end
xlabel('时间 (符号周期)');
ylabel('幅度');
grid on;
hold off;
end
function h = manual_root_raised_cosine(t, T, beta)
% 手动计算根升余弦滤波器
h = zeros(size(t));
for i = 1:length(t)
t_val = t(i);
if abs(t_val) == T/(4*beta)
h(i) = (beta/sqrt(2*T)) * ...
((1+2/pi)*sin(pi/(4*beta)) + (1-2/pi)*cos(pi/(4*beta)));
elseif t_val == 0
h(i) = (1/sqrt(T)) * (1 + beta*(4/pi - 1));
else
term1 = sin(pi*(1-beta)*t_val/T + 4*beta*t_val/T*cos(pi*(1+beta)*t_val/T));
term2 = pi*t_val/T * (1 - (4*beta*t_val/T).^2);
h(i) = (1/sqrt(T)) * term1 ./ term2;
end
end
end
%% 滤波器特性总结
fprintf('=== 根升余弦滤波器特性总结 ===\n');
fprintf('滚降因子 β: %.2f\n', beta);
fprintf('滤波器长度: %d 个采样点\n', length(h_rc));
fprintf('每符号采样点数: %d\n', sps);
fprintf('滤波器跨度: %d 个符号\n', filter_span);
% 计算关键参数
energy = sum(h_rc.^2);
fprintf('滤波器能量: %.4f\n', energy);
% 检查奈奎斯特准则
sampling_offset = round(length(h_rc)/2) + sps;
isi_values = h_rc(sampling_offset:sps:end);
isi_power = sum(isi_values.^2) - h_rc(round(length(h_rc)/2))^2;
fprintf('ISI功率: %.6f\n', isi_power);
特性分析
1. 时域特性
- 主瓣宽度:与滚降因子β相关
- 旁瓣衰减:决定符号间干扰(ISI)大小
- 过零点:在整数倍符号周期处过零,满足奈奎斯特准则
2. 频域特性
- 带宽:
B = (1 + β) / (2T) Hz - 滚降特性:平滑的过渡带
- 带外抑制:良好的频谱利用率
3. 滚降因子影响
- β较小(0.2-0.3):频谱效率高,但对定时误差敏感
- β中等(0.4-0.6):平衡频谱效率和抗干扰能力
- β较大(0.7-1.0):抗干扰能力强,但频谱效率低
参考代码 根升余弦滤波器 www.3dddown.com/csa/82526.html
实际应用
- 无线通信:常用β=0.35(卫星)或β=0.5(蜂窝)
- 有线通信:根据信道特性选择β值
- 数字电视:通常使用较小的滚降因子
