这些代码可以与Simulink模型配合使用,或者在某些情况下直接在MATLAB中实现功能。

1. 系统初始化和USRP配置

% 系统参数初始化和USRP配置
function initUSRPSystem()
    % 系统参数
    sampleRate = 1e6;           % 采样率 1 MHz
    centerFreq = 2.4e9;         % 中心频率 2.4 GHz
    gain = 20;                  % 增益 20 dB
    frameSize = 1000;           % 帧大小
    modulationType = 'QPSK';    % 调制类型

    % USRP参数配置
    usrpParams = struct();
    usrpParams.IPAddress = '192.168.10.2';  % USRP设备IP地址
    usrpParams.CenterFrequency = centerFreq;
    usrpParams.Gain = gain;
    usrpParams.SampleRate = sampleRate;
    usrpParams.ChannelMapping = 1;          % 使用的通道
    usrpParams.EnableBurstMode = true;      % 启用突发模式

    % 保存参数到工作区
    assignin('base', 'usrpParams', usrpParams);
    assignin('base', 'frameSize', frameSize);
    assignin('base', 'modulationType', modulationType);
    assignin('base', 'sampleRate', sampleRate);

    % 显示配置信息
    disp('USRP系统初始化完成:');
    disp(['中心频率: ', num2str(centerFreq/1e6), ' MHz']);
    disp(['采样率: ', num2str(sampleRate/1e3), ' kHz']);
    disp(['增益: ', num2str(gain), ' dB']);
    disp(['调制方式: ', modulationType]);
end

2. 语音/图像信源处理

2.1 语音信源处理

% 语音信源处理
function bitStream = processAudioSource(audioFile, bitsPerFrame)
    % 读取音频文件
    [audioData, fs] = audioread(audioFile);

    % 如果是立体声,转换为单声道
    if size(audioData, 2) > 1
        audioData = mean(audioData, 2);
    end

    % 重采样到8kHz(如果需要)
    if fs ~= 8000
        audioData = resample(audioData, 8000, fs);
        fs = 8000;
    end

    % 量化为8位
    audioData = audioData / max(abs(audioData));
    quantizedAudio = round((audioData + 1) * 127.5);
    quantizedAudio(quantizedAudio < 0) = 0;
    quantizedAudio(quantizedAudio > 255) = 255;

    % 转换为比特流
    bitStream = [];
    for i = 1:length(quantizedAudio)
        bits = de2bi(quantizedAudio(i), 8, 'left-msb');
        bitStream = [bitStream; bits(:)];
    end

    % 调整为帧大小的整数倍
    remainder = mod(length(bitStream), bitsPerFrame);
    if remainder ~= 0
        padding = zeros(bitsPerFrame - remainder, 1);
        bitStream = [bitStream; padding];
    end

    % 显示信息
    disp(['音频处理完成,生成比特流长度: ', num2str(length(bitStream))]);
    disp(['帧数: ', num2str(length(bitStream)/bitsPerFrame)]);
end

2.2 图像信源处理

% 图像信源处理
function bitStream = processImageSource(imageFile, bitsPerFrame)
    % 读取图像
    img = imread(imageFile);

    % 转换为灰度图(如果是彩色图像)
    if size(img, 3) == 3
        img = rgb2gray(img);
    end

    % 调整图像大小(可选)
    img = imresize(img, [256, 256]);

    % 转换为比特流
    imgVector = img(:);
    bitStream = [];
    for i = 1:length(imgVector)
        bits = de2bi(imgVector(i), 8, 'left-msb');
        bitStream = [bitStream; bits(:)];
    end

    % 调整为帧大小的整数倍
    remainder = mod(length(bitStream), bitsPerFrame);
    if remainder ~= 0
        padding = zeros(bitsPerFrame - remainder, 1);
        bitStream = [bitStream; padding];
    end

    % 保存原始图像尺寸(用于接收端重构)
    imgSize = size(img);
    assignin('base', 'originalImageSize', imgSize);

    % 显示信息
    disp(['图像处理完成,生成比特流长度: ', num2str(length(bitStream))]);
    disp(['帧数: ', num2str(length(bitStream)/bitsPerFrame)]);
end

3. 信道编码

3.1 卷积码编码器

% 卷积码编码
function encodedBits = convolutionalEncode(inputBits)
    % 卷积码参数
    constraintLength = 7;
    codeGenerator = [171, 133];  % 八进制表示

    % 创建卷积编码器对象
    trellis = poly2trellis(constraintLength, codeGenerator);

    % 编码
    encodedBits = convenc(inputBits, trellis);

    % 显示信息
    disp('卷积编码完成:');
    disp(['输入比特数: ', num2str(length(inputBits))]);
    disp(['输出比特数: ', num2str(length(encodedBits))]);
    disp(['编码率: 1/', num2str(length(encodedBits)/length(inputBits))]);
end

3.2 BCH码编码器(线性分组码)

% BCH码编码(线性分组码)
function encodedBits = bchEncode(inputBits, n, k)
    % 默认参数
    if nargin < 2
        n = 63;  % 码字长度
        k = 45;  % 信息位长度
    end

    % 创建BCH编码器对象
    encoder = comm.BCHEncoder(n, k);

    % 调整输入长度为k的整数倍
    remainder = mod(length(inputBits), k);
    if remainder ~= 0
        padding = zeros(k - remainder, 1);
        inputBits = [inputBits; padding];
    end

    % 分块编码
    numBlocks = length(inputBits) / k;
    encodedBits = [];

    for i = 1:numBlocks
        blockStart = (i-1)*k + 1;
        blockEnd = i*k;
        inputBlock = inputBits(blockStart:blockEnd);

        % 编码当前块
        encodedBlock = encoder(inputBlock);
        encodedBits = [encodedBits; encodedBlock];
    end

    % 显示信息
    disp('BCH编码完成:');
    disp(['输入比特数: ', num2str(length(inputBits))]);
    disp(['输出比特数: ', num2str(length(encodedBits))]);
    disp(['编码率: ', num2str(k/n)]);
end

4. QPSK调制/解调

4.1 QPSK调制

% QPSK调制
function modulatedSignal = qpskModulate(inputBits, sps)
    % 默认参数
    if nargin < 2
        sps = 4;  % 每个符号的样本数
    end

    % 创建QPSK调制器对象
    qpskMod = comm.QPSKModulator('BitInput', true);

    % 调制
    symbols = qpskMod(inputBits);

    % 上采样
    modulatedSignal = upsample(symbols, sps);

    % 成形滤波器(根升余弦滤波器)
    filterSpan = 10;  % 滤波器长度(符号周期)
    rolloff = 0.35;   % 滚降因子
    rrcFilter = rcosdesign(rolloff, filterSpan, sps);

    % 应用滤波器
    modulatedSignal = filter(rrcFilter, 1, modulatedSignal);

    % 显示信息
    disp('QPSK调制完成:');
    disp(['输入比特数: ', num2str(length(inputBits))]);
    disp(['符号数: ', num2str(length(inputBits)/2)]);
    disp(['输出样本数: ', num2str(length(modulatedSignal))]);
end

4.2 QPSK解调

% QPSK解调
function demodulatedBits = qpskDemodulate(receivedSignal, sps)
    % 默认参数
    if nargin < 2
        sps = 4;  % 每个符号的样本数
    end

    % 匹配滤波
    filterSpan = 10;  % 滤波器长度(符号周期)
    rolloff = 0.35;   % 滚降因子
    rrcFilter = rcosdesign(rolloff, filterSpan, sps);

    % 应用匹配滤波器
    filteredSignal = filter(rrcFilter, 1, receivedSignal);

    % 下采样
    downsampled = filteredSignal(sps:sps:end);

    % 创建QPSK解调器对象
    qpskDemod = comm.QPSKDemodulator('BitOutput', true);

    % 解调
    demodulatedBits = qpskDemod(downsampled);

    % 显示信息
    disp('QPSK解调完成:');
    disp(['输入样本数: ', num2str(length(receivedSignal))]);
    disp(['符号数: ', num2str(length(downsampled))]);
    disp(['输出比特数: ', num2str(length(demodulatedBits))]);
end

5. 同步算法

5.1 载波同步(Costas环)

% 载波同步(Costas环)
function [syncSignal, phaseError] = carrierSync(receivedSignal, loopBW)
    % 默认参数
    if nargin < 2
        loopBW = 0.01;  % 环路带宽
    end

    % 初始化
    N = length(receivedSignal);
    syncSignal = zeros(N, 1);
    phaseError = zeros(N, 1);

    % Costas环参数
    theta = 0;          % 初始相位估计
    beta = 0.5;         % 环路增益
    alpha = loopBW/4;   % 环路滤波器系数

    % 环路滤波器状态
    z = 0;

    % Costas环实现
    for i = 1:N
        % 当前样本
        r = receivedSignal(i);

        % 本地振荡器
        lo_i = cos(theta);
        lo_q = -sin(theta);

        % 混频器输出
        i_arm = r * lo_i;
        q_arm = r * lo_q;

        % 环路滤波器
        pd_out = i_arm * q_arm;  % 相位检测器输出
        v = pd_out * beta + z;   % 环路滤波器输出
        z = z + pd_out * alpha;  % 更新滤波器状态

        % 更新相位估计
        theta = theta + v;

        % 保存结果
        syncSignal(i) = i_arm + 1j*q_arm;
        phaseError(i) = pd_out;
    end

    % 显示信息
    disp('载波同步完成');
    disp(['平均相位误差: ', num2str(mean(abs(phaseError)))]);
end

5.2 码元同步(Gardner算法)

% 码元同步(Gardner算法)
function [syncSignal, timingError] = symbolSync(receivedSignal, sps)
    % 默认参数
    if nargin < 2
        sps = 4;  % 每个符号的样本数
    end

    % 初始化
    N = length(receivedSignal);
    maxSymbols = ceil(N/sps);
    syncSignal = zeros(maxSymbols, 1);
    timingError = zeros(maxSymbols, 1);

    % Gardner算法参数
    mu = 0.05;        % 步长
    tau = 0;          % 初始时间偏移
    k = 1;            % 符号索引

    % 插值器
    interp = @(x, t) interp1(1:length(x), x, t, 'spline');

    % Gardner算法实现
    while (1+tau) < N
        % 当前符号的中点和两端
        t_mid = 1 + tau + sps/2;
        t_curr = 1 + tau + sps;

        % 检查是否超出信号范围
        if t_curr >= N
            break;
        end

        % 插值获取样本
        x_prev = interp(real(receivedSignal), 1+tau);
        x_mid = interp(real(receivedSignal), t_mid);
        x_curr = interp(real(receivedSignal), t_curr);

        % Gardner定时误差检测器
        err = (x_prev - x_curr) * x_mid;

        % 更新时间偏移
        tau = tau + mu * err;

        % 保存当前符号和误差
        syncSignal(k) = x_curr;
        timingError(k) = err;

        % 更新符号索引
        k = k + 1;
        tau = tau + sps;
    end

    % 裁剪输出
    syncSignal = syncSignal(1:k-1);
    timingError = timingError(1:k-1);

    % 显示信息
    disp('码元同步完成');
    disp(['恢复符号数: ', num2str(length(syncSignal))]);
    disp(['平均定时误差: ', num2str(mean(abs(timingError)))]);
end

5.3 帧同步

% 帧同步
function [frameStart, correlation] = frameSync(receivedSignal, syncSequence)
    % 默认参数
    if nargin < 2
        % 默认使用Barker码作为同步序列
        syncSequence = [1, 1, 1, 1, 1, -1, -1, 1, 1, -1, 1, -1, 1];
    end

    % 计算相关
    correlation = xcorr(receivedSignal, syncSequence);

    % 只保留有效部分
    correlation = correlation(length(syncSequence):end);

    % 查找相关峰值
    [maxCorr, maxIdx] = max(abs(correlation));

    % 帧起始位置
    frameStart = maxIdx;

    % 显示信息
    disp('帧同步完成');
    disp(['帧起始位置: ', num2str(frameStart)]);
    disp(['相关峰值: ', num2str(maxCorr)]);
end

6. 信道解码

6.1 卷积码解码(Viterbi算法)

% 卷积码解码(Viterbi算法)
function decodedBits = convolutionalDecode(receivedBits, tracebackLength)
    % 默认参数
    if nargin < 2
        tracebackLength = 35;  % 回溯长度
    end

    % 卷积码参数
    constraintLength = 7;
    codeGenerator = [171, 133];  % 八进制表示

    % 创建卷积解码器对象
    trellis = poly2trellis(constraintLength, codeGenerator);

    % Viterbi解码
    decodedBits = vitdec(receivedBits, trellis, tracebackLength, 'trunc', 'hard');

    % 显示信息
    disp('卷积解码完成:');
    disp(['输入比特数: ', num2str(length(receivedBits))]);
    disp(['输出比特数: ', num2str(length(decodedBits))]);
end

6.2 BCH码解码

% BCH码解码
function decodedBits = bchDecode(receivedBits, n, k)
    % 默认参数
    if nargin < 2
        n = 63;  % 码字长度
        k = 45;  % 信息位长度
    end

    % 创建BCH解码器对象
    decoder = comm.BCHDecoder(n, k);

    % 分块解码
    numBlocks = length(receivedBits) / n;
    decodedBits = [];

    for i = 1:numBlocks
        blockStart = (i-1)*n + 1;
        blockEnd = i*n;
        receivedBlock = receivedBits(blockStart:blockEnd);

        % 解码当前块
        decodedBlock = decoder(receivedBlock);
        decodedBits = [decodedBits; decodedBlock];
    end

    % 显示信息
    disp('BCH解码完成:');
    disp(['输入比特数: ', num2str(length(receivedBits))]);
    disp(['输出比特数: ', num2str(length(decodedBits))]);
end

7. 误码率计算

% 误码率计算
function [ber, numErrors] = calculateBER(transmittedBits, receivedBits)
    % 确保两个序列长度相同
    minLength = min(length(transmittedBits), length(receivedBits));
    transmittedBits = transmittedBits(1:minLength);
    receivedBits = receivedBits(1:minLength);

    % 计算误码
    errors = (transmitted