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

实际应用

  1. 无线通信:常用β=0.35(卫星)或β=0.5(蜂窝)
  2. 有线通信:根据信道特性选择β值
  3. 数字电视:通常使用较小的滚降因子