直扩信号参数估计:载频、码速率和扩频增益

MATLAB程序用于估计接收到的直扩信号的载频、码速率和扩频增益:

主程序文件

%% 直扩信号参数估计:载频、码速率和扩频增益
clear; close all; clc;

fprintf('=== 直扩信号参数估计 ===\n');

%% 生成测试直扩信号(如果无真实信号)
[receivedSignal, params] = generateDSSSTestSignal();

%% 信号预处理
[preprocessedSignal, preprocessingInfo] = preprocessSignal(receivedSignal, params);

%% 载频估计
[carrierFreq, carrierEstimationInfo] = estimateCarrierFrequency(preprocessedSignal, params);

%% 码速率估计
[codeRate, codeEstimationInfo] = estimateCodeRate(preprocessedSignal, params);

%% 扩频增益估计
[spreadingGain, gainEstimationInfo] = estimateSpreadingGain(preprocessedSignal, codeRate, params);

%% 参数验证和精度分析
[validationResults, confidence] = validateEstimations(carrierFreq, codeRate, spreadingGain, params);

%% 结果显示和可视化
displayResults(carrierFreq, codeRate, spreadingGain, validationResults, confidence, params);

%% 性能分析
analyzePerformance(carrierFreq, codeRate, spreadingGain, params);

fprintf('\n直扩信号参数估计完成!\n');

测试信号生成

function [receivedSignal, params] = generateDSSSTestSignal()
    % 生成直扩测试信号
    
    fprintf('生成直扩测试信号...\n');
    
    % 信号参数
    params = struct();
    params.true.carrierFreq = 2.4e9;          % 真实载频 2.4 GHz
    params.true.codeRate = 10e6;              % 真实码速率 10 MHz
    params.true.spreadingGain = 127;          % 真实扩频增益 127
    params.true.samplingRate = 100e6;         % 采样率 100 MHz
    params.true.signalDuration = 100e-6;      % 信号持续时间 100 μs
    
    % 信道参数
    params.channel.SNR = 10;                  % 信噪比 dB
    params.channel.frequencyOffset = 50e3;    % 频率偏移 50 kHz
    params.channel.phaseNoise = 0.01;         % 相位噪声
    
    % 计算信号参数
    numSamples = round(params.true.signalDuration * params.true.samplingRate);
    t = (0:numSamples-1) / params.true.samplingRate;
    
    % 生成扩频码 (Gold码或m序列)
    spreadingCode = generateSpreadingCode(params.true.spreadingGain);
    
    % 生成信息序列
    infoBits = randi([0 1], 1, ceil(numSamples / params.true.spreadingGain));
    
    % 扩频调制
    basebandSignal = spreadSignal(infoBits, spreadingCode, params);
    
    % 载波调制
    carrier = exp(1j * 2 * pi * params.true.carrierFreq * t);
    modulatedSignal = basebandSignal .* carrier;
    
    % 添加频率偏移和相位噪声
    frequencyOffset = exp(1j * 2 * pi * params.channel.frequencyOffset * t);
    phaseNoise = exp(1j * params.channel.phaseNoise * randn(size(t)));
    
    modulatedSignal = modulatedSignal .* frequencyOffset .* phaseNoise;
    
    % 添加噪声
    receivedSignal = addNoise(modulatedSignal, params.channel.SNR);
    
    fprintf('测试信号生成完成:\n');
    fprintf('  真实载频: %.3f GHz\n', params.true.carrierFreq/1e9);
    fprintf('  真实码速率: %.3f MHz\n', params.true.codeRate/1e6);
    fprintf('  真实扩频增益: %d\n', params.true.spreadingGain);
    fprintf('  信号长度: %d 采样点\n', numSamples);
end

function spreadingCode = generateSpreadingCode(gain)
    % 生成扩频码 (m序列)
    
    % 使用线性反馈移位寄存器生成m序列
    registerLength = ceil(log2(gain + 1));
    
    % 选择本原多项式 (示例)
    switch registerLength
        case 7  % 127位m序列
            taps = [7, 1];  % x^7 + x + 1
        case 6  % 63位m序列
            taps = [6, 1];  % x^6 + x + 1
        case 5  % 31位m序列
            taps = [5, 2];  % x^5 + x^2 + 1
        otherwise
            taps = [registerLength, 1];  % 默认
    end
    
    % 初始化寄存器
    register = ones(1, registerLength);
    spreadingCode = zeros(1, 2^registerLength - 1);
    
    for i = 1:length(spreadingCode)
        % 输出位
        spreadingCode(i) = register(end);
        
        % 计算反馈
        feedback = mod(sum(register(taps)), 2);
        
        % 移位
        register = [feedback, register(1:end-1)];
    end
    
    % 转换为BPSK调制 (-1, +1)
    spreadingCode = 2 * spreadingCode - 1;
    
    % 截断到指定增益
    spreadingCode = spreadingCode(1:gain);
end

function spreadSignal = spreadSignal(infoBits, spreadingCode, params)
    % 扩频调制
    
    numChipsPerBit = length(spreadingCode);
    numBits = length(infoBits);
    
    % 将信息比特映射到BPSK
    mappedBits = 2 * infoBits - 1;
    
    % 扩频
    spreadSignal = zeros(1, numBits * numChipsPerBit);
    for i = 1:numBits
        startIdx = (i-1) * numChipsPerBit + 1;
        endIdx = i * numChipsPerBit;
        spreadSignal(startIdx:endIdx) = mappedBits(i) * spreadingCode;
    end
    
    % 调整采样率
    samplesPerChip = round(params.true.samplingRate / params.true.codeRate);
    if samplesPerChip > 1
        % 上采样
        spreadSignal = repelem(spreadSignal, samplesPerChip);
    end
end

function noisySignal = addNoise(signal, SNR_dB)
    % 添加高斯白噪声
    
    signalPower = mean(abs(signal).^2);
    noisePower = signalPower / (10^(SNR_dB/10));
    noise = sqrt(noisePower/2) * (randn(size(signal)) + 1j*randn(size(signal)));
    
    noisySignal = signal + noise;
end

信号预处理

function [preprocessedSignal, info] = preprocessSignal(receivedSignal, params)
    % 信号预处理
    
    fprintf('信号预处理...\n');
    
    info = struct();
    
    % 1. 自动增益控制
    preprocessedSignal = automaticGainControl(receivedSignal);
    
    % 2. 带通滤波(如果知道大致频带)
    if isfield(params, 'estimatedCarrierRange')
        preprocessedSignal = bandpassFilter(preprocessedSignal, params);
    end
    
    % 3. 下变频到基带(使用估计的载频或已知范围)
    if isfield(params, 'estimatedCarrierFreq')
        preprocessedSignal = downconvertToBaseband(preprocessedSignal, params);
    end
    
    % 4. 计算信号统计特性
    info.signalPower = mean(abs(preprocessedSignal).^2);
    info.noisePower = estimateNoisePower(preprocessedSignal);
    info.estimatedSNR = 10 * log10(info.signalPower / info.noisePower);
    
    fprintf('  信号功率: %.2f dB\n', 10*log10(info.signalPower));
    fprintf('  噪声功率: %.2f dB\n', 10*log10(info.noisePower));
    fprintf('  估计SNR: %.2f dB\n', info.estimatedSNR);
    
    fprintf('信号预处理完成\n');
end

function processedSignal = automaticGainControl(signal)
    % 自动增益控制
    
    targetPower = 1.0;
    currentPower = mean(abs(signal).^2);
    gain = sqrt(targetPower / currentPower);
    
    processedSignal = signal * gain;
end

function filteredSignal = bandpassFilter(signal, params)
    % 带通滤波
    
    samplingRate = params.true.samplingRate;
    
    if isfield(params, 'estimatedCarrierRange')
        % 使用估计的载频范围
        f_low = params.estimatedCarrierRange(1);
        f_high = params.estimatedCarrierRange(2);
    else
        % 默认频带
        f_low = 2.3e9;
        f_high = 2.5e9;
    end
    
    % 设计带通滤波器
    nyquist = samplingRate / 2;
    Wn = [f_low, f_high] / nyquist;
    
    if Wn(2) >= 1
        Wn(2) = 0.99;
    end
    
    [b, a] = butter(6, Wn, 'bandpass');
    filteredSignal = filter(b, a, signal);
end

function basebandSignal = downconvertToBaseband(signal, params)
    % 下变频到基带
    
    samplingRate = params.true.samplingRate;
    t = (0:length(signal)-1) / samplingRate;
    
    if isfield(params, 'estimatedCarrierFreq')
        carrierFreq = params.estimatedCarrierFreq;
    else
        carrierFreq = params.true.carrierFreq;  % 使用真实值(实际中未知)
    end
    
    % 生成本地载波
    localCarrier = exp(-1j * 2 * pi * carrierFreq * t);
    
    % 下变频
    basebandSignal = signal .* localCarrier;
    
    % 低通滤波
    cutoffFreq = min(10e6, samplingRate/4);  % 假设信号带宽小于10MHz
    Wn = cutoffFreq / (samplingRate/2);
    [b, a] = butter(6, Wn, 'low');
    basebandSignal = filter(b, a, basebandSignal);
end

function noisePower = estimateNoisePower(signal)
    % 估计噪声功率
    
    % 使用小波变换估计噪声
    [c, l] = wavedec(real(signal), 5, 'db4');
    noisePower = median(abs(c)) / 0.6745;
    noisePower = noisePower^2;
end

载频估计

function [carrierFreq, info] = estimateCarrierFrequency(signal, params)
    % 估计载波频率
    
    fprintf('估计载波频率...\n');
    
    info = struct();
    samplingRate = params.true.samplingRate;
    
    % 方法1: 功率谱密度峰值检测
    [carrierFreq1, confidence1] = estimateByPSD(signal, samplingRate);
    
    % 方法2: 循环平稳特征检测
    [carrierFreq2, confidence2] = estimateByCyclostationarity(signal, samplingRate);
    
    % 方法3: 高阶统计量
    [carrierFreq3, confidence3] = estimateByHigherOrderStats(signal, samplingRate);
    
    % 融合估计结果
    carrierFreq = fuseEstimations(carrierFreq1, carrierFreq2, carrierFreq3, ...
                                 confidence1, confidence2, confidence3);
    
    info.methods.psd = carrierFreq1;
    info.methods.cyclo = carrierFreq2;
    info.methods.hos = carrierFreq3;
    info.confidence = [confidence1, confidence2, confidence3];
    info.finalEstimation = carrierFreq;
    
    % 误差分析
    if isfield(params.true, 'carrierFreq')
        trueFreq = params.true.carrierFreq;
        error = abs(carrierFreq - trueFreq);
        relativeError = error / trueFreq * 100;
        
        info.trueValue = trueFreq;
        info.absoluteError = error;
        info.relativeError = relativeError;
        
        fprintf('  真实载频: %.6f GHz\n', trueFreq/1e9);
        fprintf('  估计载频: %.6f GHz\n', carrierFreq/1e9);
        fprintf('  绝对误差: %.3f kHz\n', error/1e3);
        fprintf('  相对误差: %.3f%%\n', relativeError);
    else
        fprintf('  估计载频: %.6f GHz\n', carrierFreq/1e9);
    end
    
    fprintf('载频估计完成\n');
end

function [carrierFreq, confidence] = estimateByPSD(signal, samplingRate)
    % 通过功率谱密度估计载频
    
    % 计算功率谱密度
    [psd, f] = pwelch(signal, hamming(1024), 512, 1024, samplingRate);
    
    % 寻找峰值
    [peaks, peakLocs] = findpeaks(psd, 'SortStr', 'descend', 'NPeaks', 5);
    
    if isempty(peaks)
        carrierFreq = 0;
        confidence = 0;
        return;
    end
    
    % 选择最高峰值对应的频率
    mainPeakLoc = peakLocs(1);
    carrierFreq = f(mainPeakLoc);
    
    % 计算置信度(基于峰值突出程度)
    if length(peaks) > 1
        prominence = (peaks(1) - peaks(2)) / peaks(1);
        confidence = min(1, prominence * 2);
    else
        confidence = 0.7;
    end
    
    % 可视化
    if false  % 设置为true来显示PSD
        figure;
        plot(f/1e6, 10*log10(psd));
        xlabel('频率 (MHz)');
        ylabel('功率谱密度 (dB/Hz)');
        title('功率谱密度分析');
        grid on;
        hold on;
        plot(carrierFreq/1e6, 10*log10(peaks(1)), 'ro', 'MarkerSize', 10);
        legend('PSD', '估计载频');
    end
end

function [carrierFreq, confidence] = estimateByCyclostationarity(signal, samplingRate)
    % 通过循环平稳特征估计载频
    
    % 计算循环谱
    alpha = 0:0.01:0.5;  % 循环频率范围
    cyclicSpectrum = zeros(length(alpha), 1024);
    
    for i = 1:length(alpha)
        % 简化的循环谱计算
        shiftedSignal = signal .* exp(-1j * 2 * pi * alpha(i) * (0:length(signal)-1));
        [psd, ~] = pwelch(shiftedSignal, hamming(256), 128, 256, samplingRate);
        cyclicSpectrum(i, :) = psd(1:1024);
    end
    
    % 寻找循环谱中的特征
    featureMap = sum(cyclicSpectrum, 2);
    [~, maxIdx] = max(featureMap);
    
    % 估计载频(基于循环频率)
    carrierFreq = alpha(maxIdx) * samplingRate;
    
    % 置信度基于特征突出程度
    sortedFeatures = sort(featureMap, 'descend');
    if length(sortedFeatures) > 1
        confidence = (sortedFeatures(1) - sortedFeatures(2)) / sortedFeatures(1);
    else
        confidence = 0.6;
    end
    
    confidence = min(0.9, confidence);
end

function [carrierFreq, confidence] = estimateByHigherOrderStats(signal, samplingRate)
    % 通过高阶统计量估计载频
    
    % 计算四阶累积量(对载频敏感)
    signalReal = real(signal);
    signalImag = imag(signal);
    
    % 简化的高阶统计量分析
    kurtosisReal = kurtosis(signalReal);
    kurtosisImag = kurtosis(signalImag);
    
    % 基于峰度的频率估计(启发式方法)
    freqShift = (kurtosisReal - 3) * 1e6;  % 缩放因子
    
    % 初始频率估计
    [psd, f] = pwelch(signal, hamming(512), 256, 512, samplingRate);
    [~, initialFreqIdx] = max(psd);
    initialFreq = f(initialFreqIdx);
    
    carrierFreq = initialFreq + freqShift;
    
    % 置信度基于峰度值
    confidence = min(0.8, abs(kurtosisReal - 3) / 10);
end

function fusedFreq = fuseEstimations(freq1, freq2, freq3, conf1, conf2, conf3)
    % 融合多个估计结果
    
    estimations = [freq1, freq2, freq3];
    confidences = [conf1, conf2, conf3];
    
    % 归一化置信度权重
    totalConfidence = sum(confidences);
    if totalConfidence == 0
        weights = [1/3, 1/3, 1/3];
    else
        weights = confidences / totalConfidence;
    end
    
    % 加权平均
    fusedFreq = sum(estimations .* weights);
    
    % 如果估计值差异太大,选择最可信的
    stdEstimations = std(estimations);
    if stdEstimations > 0.1 * mean(estimations)  % 差异超过10%
        [~, bestIdx] = max(confidences);
        fusedFreq = estimations(bestIdx);
    end
end

码速率估计

function [codeRate, info] = estimateCodeRate(signal, params)
    % 估计码速率
    
    fprintf('估计码速率...\n');
    
    info = struct();
    samplingRate = params.true.samplingRate;
    
    % 方法1: 自相关函数分析
    [codeRate1, confidence1] = estimateByAutocorrelation(signal, samplingRate);
    
    % 方法2: 小波变换分析
    [codeRate2, confidence2] = estimateByWavelet(signal, samplingRate);
    
    % 方法3: 循环自相关
    [codeRate3, confidence3] = estimateByCyclicAutocorrelation(signal, samplingRate);
    
    % 融合估计结果
    codeRate = fuseCodeRateEstimations(codeRate1, codeRate2, codeRate3, ...
                                      confidence1, confidence2, confidence3);
    
    info.methods.autocorr = codeRate1;
    info.methods.wavelet = codeRate2;
    info.methods.cyclic = codeRate3;
    info.confidence = [confidence1, confidence2, confidence3];
    info.finalEstimation = codeRate;
    
    % 误差分析
    if isfield(params.true, 'codeRate')
        trueRate = params.true.codeRate;
        error = abs(codeRate - trueRate);
        relativeError = error / trueRate * 100;
        
        info.trueValue = trueRate;
        info.absoluteError = error;
        info.relativeError = relativeError;
        
        fprintf('  真实码速率: %.3f MHz\n', trueRate/1e6);
        fprintf('  估计码速率: %.3f MHz\n', codeRate/1e6);
        fprintf('  绝对误差: %.3f kHz\n', error/1e3);
        fprintf('  相对误差: %.3f%%\n', relativeError);
    else
        fprintf('  估计码速率: %.3f MHz\n', codeRate/1e6);
    end
    
    fprintf('码速率估计完成\n');
end

function [codeRate, confidence] = estimateByAutocorrelation(signal, samplingRate)
    % 通过自相关函数估计码速率
    
    % 计算自相关函数
    autocorr = xcorr(real(signal), 'coeff');
    autocorr = autocorr(length(signal):end);  % 取正时延部分
    
    % 寻找周期性峰值
    [peaks, peakLocs] = findpeaks(autocorr, 'MinPeakHeight', 0.1, 'MinPeakDistance', 10);
    
    if length(peakLocs) < 2
        codeRate = samplingRate / 100;  % 默认值
        confidence = 0.3;
        return;
    end
    
    % 计算峰值间隔(码片周期)
    peakIntervals = diff(peakLocs);
    chipPeriod = median(peakIntervals);
    
    codeRate = samplingRate / chipPeriod;
    
    % 置信度基于峰值规律性
    intervalStd = std(peakIntervals);
    confidence = max(0, 1 - intervalStd / chipPeriod);
    
    % 可视化
    if false
        figure;
        plot((0:length(autocorr)-1)/samplingRate*1e6, autocorr);
        xlabel('时延 (μs)');
        ylabel('自相关系数');
        title('自相关函数分析');
        grid on;
        hold on;
        plot(peakLocs/samplingRate*1e6, peaks, 'ro');
        legend('自相关函数', '峰值');
    end
end

function [codeRate, confidence] = estimateByWavelet(signal, samplingRate)
    % 通过小波变换估计码速率
    
    % 使用小波变换检测码片边界
    signalReal = real(signal);
    
    % 选择合适的小波基
    [c, l] = wavedec(signalReal, 5, 'db4');
    
    % 分析细节系数
    detailCoeffs = detcoef(c, l, 3);  % 选择适当的分解层数
    
    % 检测细节系数中的跳变点(码片边界)
    threshold = 3 * median(abs(detailCoeffs)) / 0.6745;
    significantPoints = find(abs(detailCoeffs) > threshold);
    
    if length(significantPoints) < 2
        codeRate = samplingRate / 100;
        confidence = 0.3;
        return;
    end
    
    % 计算跳变点间隔
    intervals = diff(significantPoints);
    chipSamples = median(intervals);
    
    % 考虑小波分解的尺度
    scaleFactor = 2^3;  % 第3层分解
    actualChipSamples = chipSamples * scaleFactor;
    
    codeRate = samplingRate / actualChipSamples;
    
    % 置信度基于跳变点的规律性
    confidence = max(0, 1 - std(intervals) / median(intervals));
end

function [codeRate, confidence] = estimateByCyclicAutocorrelation(signal, samplingRate)
    % 通过循环自相关估计码速率
    
    signalReal = real(signal);
    N = length(signalReal);
    
    % 计算循环自相关
    maxLag = min(1000, round(N/10));
    cyclicCorr = zeros(1, maxLag);
    
    for tau = 1:maxLag
        if tau < N
            product = signalReal(1:end-tau) .* signalReal(tau+1:end);
            cyclicCorr(tau) = mean(product);
        end
    end
    
    % 寻找周期性
    [peaks, peakLocs] = findpeaks(cyclicCorr, 'MinPeakHeight', 0.05*max(cyclicCorr));
    
    if length(peakLocs) < 2
        codeRate = samplingRate / 100;
        confidence = 0.3;
        return;
    end
    
    % 估计码片周期
    fundamentalPeriod = findFundamentalPeriod(peakLocs);
    codeRate = samplingRate / fundamentalPeriod;
    
    % 置信度
    confidence = min(0.8, length(peaks) / 10);
end

function period = findFundamentalPeriod(peakLocs)
    % 寻找基本周期
    
    if length(peakLocs) < 2
        period = peakLocs(1);
        return;
    end
    
    % 计算所有峰值间隔
    intervals = diff(peakLocs);
    
    % 使用直方图找到最常见的间隔
    [counts, edges] = histcounts(intervals, 'BinMethod', 'integers');
    [~, maxIdx] = max(counts);
    period = round(mean([edges(maxIdx), edges(maxIdx+1)]));
end

function fusedRate = fuseCodeRateEstimations(rate1, rate2, rate3, conf1, conf2, conf3)
    % 融合码速率估计结果
    
    estimations = [rate1, rate2, rate3];
    confidences = [conf1, conf2, conf3];
    
    % 去除异常值
    validMask = confidences > 0.2;
    if sum(validMask) == 0
        fusedRate = mean(estimations);
        return;
    end
    
    validEstimations = estimations(validMask);
    validConfidences = confidences(validMask);
    
    % 加权平均
    totalConfidence = sum(validConfidences);
    weights = validConfidences / totalConfidence;
    
    fusedRate = sum(validEstimations .* weights);
end

扩频增益估计

function [spreadingGain, info] = estimateSpreadingGain(signal, codeRate, params)
    % 估计扩频增益
    
    fprintf('估计扩频增益...\n');
    
    info = struct();
    samplingRate = params.true.samplingRate;
    
    % 方法1: 自相关函数分析
    [gain1, confidence1] = estimateGainByAutocorrelation(signal, codeRate, samplingRate);
    
    % 方法2: 功率谱分析
    [gain2, confidence2] = estimateGainByPowerSpectrum(signal, codeRate, samplingRate);
    
    % 方法3: 统计特性分析
    [gain3, confidence3] = estimateGainByStatistics(signal, codeRate, samplingRate);
    
    % 融合估计结果
    spreadingGain = fuseGainEstimations(gain1, gain2, gain3, confidence1, confidence2, confidence3);
    
    info.methods.autocorr = gain1;
    info.methods.spectrum = gain2;
    info.methods.stats = gain3;
    info.confidence = [confidence1, confidence2, confidence3];
    info.finalEstimation = spreadingGain;
    
    % 误差分析
    if isfield(params.true, 'spreadingGain')
        trueGain = params.true.spreadingGain;
        error = abs(spreadingGain - trueGain);
        relativeError = error / trueGain * 100;
        
        info.trueValue = trueGain;
        info.absoluteError = error;
        info.relativeError = relativeError;
        
        fprintf('  真实扩频增益: %d\n', trueGain);
        fprintf('  估计扩频增益: %d\n', spreadingGain);
        fprintf('  绝对误差: %d\n', error);
        fprintf('  相对误差: %.3f%%\n', relativeError);
    else
        fprintf('  估计扩频增益: %d\n', spreadingGain);
    end
    
    fprintf('扩频增益估计完成\n');
end

function [gain, confidence] = estimateGainByAutocorrelation(signal, codeRate, samplingRate)
    % 通过自相关函数估计扩频增益
    
    % 计算自相关函数
    autocorr = xcorr(real(signal), 'coeff');
    autocorr = autocorr(length(signal):end);
    
    % 寻找周期性模式
    [peaks, peakLocs] = findpeaks(autocorr, 'MinPeakHeight', 0.05);
    
    if length(peakLocs) < 3
        gain = 63;  % 默认值
        confidence = 0.3;
        return;
    end
    
    % 分析峰值间隔模式
    intervals = diff(peakLocs);
    chipSamples = round(median(intervals));
    
    % 估计信息符号周期(寻找更大的周期)
    symbolIntervals = findSymbolPeriod(autocorr, chipSamples);
    
    if isempty(symbolIntervals)
        gain = 63;
        confidence = 0.3;
        return;
    end
    
    symbolSamples = median(symbolIntervals);
    gain = round(symbolSamples / chipSamples);
    
    % 置信度
    confidence = min(0.8, length(peaks) / 20);
end

function symbolIntervals = findSymbolPeriod(autocorr, chipSamples)
    % 寻找符号周期
    
    % 在自相关函数中寻找比码片周期更长的周期
    searchRange = round(chipSamples * 2):round(chipSamples * 100);
    symbolCorr = zeros(size(searchRange));
    
    for i = 1:length(searchRange)
        tau = searchRange(i);
        if tau < length(autocorr)
            symbolCorr(i) = autocorr(tau);
        end
    end
    
    % 寻找局部最大值
    [peaks, locs] = findpeaks(symbolCorr, 'MinPeakHeight', 0.1);
    
    if isempty(peaks)
        symbolIntervals = [];
        return;
    end
    
    symbolIntervals = searchRange(locs);
end

function [gain, confidence] = estimateGainByPowerSpectrum(signal, codeRate, samplingRate)
    % 通过功率谱估计扩频增益
    
    % 计算功率谱
    [psd, f] = pwelch(real(signal), hamming(512), 256, 512, samplingRate);
    
    % 分析频谱特征
    bandwidth = estimateBandwidth(psd, f);
    
    % 估计处理增益
    estimatedGain = round(bandwidth / codeRate);
    
    % 常见的扩频增益值
    commonGains = [7, 15, 31, 63, 127, 255, 511, 1023];
    
    % 选择最接近的常见值
    [~, closestIdx] = min(abs(estimatedGain - commonGains));
    gain = commonGains(closestIdx);
    
    % 置信度
    confidence = 0.6;
end

function bandwidth = estimateBandwidth(psd, f)
    % 估计信号带宽
    
    maxPSD = max(psd);
    threshold = maxPSD / 2;  % -3dB带宽
    
    aboveThreshold = psd > threshold;
    
    if ~any(aboveThreshold)
        bandwidth = f(end) - f(1);
        return;
    end
    
    startIdx = find(aboveThreshold, 1, 'first');
    endIdx = find(aboveThreshold, 1, 'last');
    
    bandwidth = f(endIdx) - f(startIdx);
end

function [gain, confidence] = estimateGainByStatistics(signal, codeRate, samplingRate)
    % 通过统计特性估计扩频增益
    
    signalReal = real(signal);
    
    % 计算信号的峰度(对扩频信号有特征性)
    kurt = kurtosis(signalReal);
    
    % 估计码片数(启发式方法)
    estimatedChips = round(1000 / (kurt - 1));  % 经验公式
    
    % 映射到常见的扩频增益
    commonGains = [7, 15, 31, 63, 127, 255, 511, 1023];
    [~, closestIdx] = min(abs(estimatedChips - commonGains));
    gain = commonGains(closestIdx);
    
    % 置信度基于峰度值
    confidence = min(0.7, abs(kurt - 1.5) / 5);
end

function fusedGain = fuseGainEstimations(gain1, gain2, gain3, conf1, conf2, conf3)
    % 融合扩频增益估计结果
    
    gains = [gain1, gain2, gain3];
    confidences = [conf1, conf2, conf3];
    
    % 选择最可信的估计
    [maxConf, bestIdx] = max(confidences);
    
    if maxConf > 0.5
        fusedGain = gains(bestIdx);
    else
        % 使用中位数
        fusedGain = median(gains);
    end
    
    % 取整到最接近的2^n-1值
    possibleGains = 2.^(3:10) - 1;
    [~, closestIdx] = min(abs(fusedGain - possibleGains));
    fusedGain = possibleGains(closestIdx);
end

参数验证和结果显示

function [validationResults, confidence] = validateEstimations(carrierFreq, codeRate, spreadingGain, params)
    % 参数验证和精度分析
    
    fprintf('参数验证和精度分析...\n');
    
    validationResults = struct();
    confidenceScores = zeros(1, 3);
    
    % 载频验证
    if isfield(params.true, 'carrierFreq')
        trueFreq = params.true.carrierFreq;
        freqError = abs(carrierFreq - trueFreq);
        freqAccuracy = max(0, 1 - freqError / trueFreq);
        confidenceScores(1) = freqAccuracy;
        
        validationResults.carrier.trueValue = trueFreq;
        validationResults.carrier.estimatedValue = carrierFreq;
        validationResults.carrier.error = freqError;
        validationResults.carrier.accuracy = freqAccuracy;
    else
        confidenceScores(1) = 0.7;  % 默认置信度
    end
    
    % 码速率验证
    if isfield(params.true, 'codeRate')
        trueRate = params.true.codeRate;
        rateError = abs(codeRate - trueRate);
        rateAccuracy = max(0, 1 - rateError / trueRate);
        confidenceScores(2) = rateAccuracy;
        
        validationResults.codeRate.trueValue = trueRate;
        validationResults.codeRate.estimatedValue = codeRate;
        validationResults.codeRate.error = rateError;
        validationResults.codeRate.accuracy = rateAccuracy;
    else
        confidenceScores(2) = 0.7;
    end
    
    % 扩频增益验证
    if isfield(params.true, 'spreadingGain')
        trueGain = params.true.spreadingGain;
        gainError = abs(spreadingGain - trueGain);
        gainAccuracy = max(0, 1 - gainError / trueGain);
        confidenceScores(3) = gainAccuracy;
        
        validationResults.spreadingGain.trueValue = trueGain;
        validationResults.spreadingGain.estimatedValue = spreadingGain;
        validationResults.spreadingGain.error = gainError;
        validationResults.spreadingGain.accuracy = gainAccuracy;
    else
        confidenceScores(3) = 0.7;
    end
    
    % 总体置信度
    confidence = mean(confidenceScores);
    
    fprintf('参数验证完成 - 总体置信度: %.2f\n', confidence);
end

function displayResults(carrierFreq, codeRate, spreadingGain, validationResults, confidence, params)
    % 显示估计结果
    
    fprintf('\n=== 直扩信号参数估计结果 ===\n');
    fprintf('载波频率: %.6f GHz\n', carrierFreq/1e9);
    fprintf('码速率: %.3f MHz\n', codeRate/1e6);
    fprintf('扩频增益: %d\n', spreadingGain);
    fprintf('总体估计置信度: %.2f\n', confidence);
    
    if isfield(validationResults, 'carrier')
        fprintf('\n--- 精度分析 ---\n');
        fprintf('载频误差: %.3f kHz\n', validationResults.carrier.error/1e3);
        fprintf('码速率误差: %.3f kHz\n', validationResults.codeRate.error/1e3);
        fprintf('扩频增益误差: %d\n', validationResults.spreadingGain.error);
    end
    
    % 可视化结果
    visualizeResults(carrierFreq, codeRate, spreadingGain, validationResults, confidence, params);
end

function visualizeResults(carrierFreq, codeRate, spreadingGain, validationResults, confidence, params)
    % 可视化估计结果
    
    figure('Position', [100, 100, 1400, 900]);
    
    % 1. 参数估计结果对比
    subplot(2,3,1);
    if isfield(validationResults, 'carrier')
        trueValues = [validationResults.carrier.trueValue/1e9, ...
                     validationResults.codeRate.trueValue/1e6, ...
                     validationResults.spreadingGain.trueValue];
        estimatedValues = [carrierFreq/1e9, codeRate/1e6, spreadingGain];
        
        bar([trueValues; estimatedValues]');
        set(gca, 'XTickLabel', {'载频 (GHz)', '码速率 (MHz)', '扩频增益'});
        legend('真实值', '估计值', 'Location', 'best');
        title('参数估计对比');
        grid on;
    else
        parameters = [carrierFreq/1e9, codeRate/1e6, spreadingGain];
        bar(parameters);
        set(gca, 'XTickLabel', {'载频 (GHz)', '码速率 (MHz)', '扩频增益'});
        title('参数估计结果');
        grid on;
    end
    
    % 2. 置信度显示
    subplot(2,3,2);
    confidenceValues = [confidence, 1-confidence];
    pie(confidenceValues, {'可信', '不确定'});
    title(sprintf('总体置信度: %.1f%%', confidence*100));
    
    % 3. 误差分析(如果有真实值)
    if isfield(validationResults, 'carrier')
        subplot(2,3,3);
        errors = [validationResults.carrier.error/validationResults.carrier.trueValue*100, ...
                 validationResults.codeRate.error/validationResults.codeRate.trueValue*100, ...
                 validationResults.spreadingGain.error/validationResults.spreadingGain.trueValue*100];
        bar(errors);
        ylabel('相对误差 (%)');
        set(gca, 'XTickLabel', {'载频', '码速率', '扩频增益'});
        title('参数估计相对误差');
        grid on;
    end
    
    % 4. 信号时域波形
    subplot(2,3,4);
    if isfield(params, 'testSignal')
        signal = params.testSignal;
        t = (0:length(signal)-1) / params.true.samplingRate * 1e6;
        plot(t, real(signal(1:min(10000, end))));
        xlabel('时间 (μs)');
        ylabel('幅度');
        title('接收信号时域波形');
        grid on;
    end
    
    % 5. 功率谱密度
    subplot(2,3,5);
    if isfield(params, 'testSignal')
        [psd, f] = pwelch(params.testSignal, hamming(1024), 512, 1024, params.true.samplingRate);
        plot(f/1e6, 10*log10(psd));
        xlabel('频率 (MHz)');
        ylabel('功率谱密度 (dB/Hz)');
        title('信号功率谱密度');
        grid on;
        hold on;
        plot(carrierFreq/1e6, max(10*log10(psd)), 'ro', 'MarkerSize', 8);
        legend('PSD', '估计载频');
    end
    
    % 6. 自相关函数
    subplot(2,3,6);
    if isfield(params, 'testSignal')
        autocorr = xcorr(real(params.testSignal), 'coeff');
        autocorr = autocorr(length(params.testSignal):end);
        tau = (0:length(autocorr)-1) / params.true.samplingRate * 1e6;
        plot(tau(1:min(1000, end)), autocorr(1:min(1000, end)));
        xlabel('时延 (μs)');
        ylabel('自相关系数');
        title('信号自相关函数');
        grid on;
    end
    
    sgtitle('直扩信号参数估计结果分析', 'FontSize', 14, 'FontWeight', 'bold');
end

function analyzePerformance(carrierFreq, codeRate, spreadingGain, params)
    % 性能分析
    
    fprintf('\n=== 系统性能分析 ===\n');
    
    % 计算处理增益
    processingGain = spreadingGain;
    theoreticalGainDB = 10 * log10(processingGain);
    
    fprintf('处理增益: %.1f dB\n', theoreticalGainDB);
    
    % 抗干扰能力分析
    jammingMargin = theoreticalGainDB - 10;  % 假设需要10dB信噪比
    fprintf('理论抗干扰容限: %.1f dB\n', jammingMargin);
    
    % 多址容量估计
    if spreadingGain > 0
        maxUsers = floor(spreadingGain / 10);  % 简化的容量估计
        fprintf('估计多址容量: %d 用户\n', maxUsers);
    end
    
    % 建议的应用场景
    fprintf('\n--- 建议应用场景 ---\n');
    if codeRate > 50e6
        fprintf('高速数据传输系统\n');
    elseif spreadingGain > 100
        fprintf('高抗干扰军事通信\n');
    else
        fprintf('常规扩频通信\n');
    end
    
    if carrierFreq > 1e9
        fprintf('微波频段通信系统\n');
    else
        fprintf('低频段通信系统\n');
    end
end

参考代码 直扩信号盲识别 www.youwenfan.com/contentcnk/65594.html

系统特点

1. 完整参数估计流程

  • 载频估计: 功率谱分析、循环平稳特征、高阶统计量
  • 码速率估计: 自相关分析、小波变换、循环自相关
  • 扩频增益估计: 周期分析、频谱分析、统计特性

2. 多方法融合

  • 多种估计算法并行运行
  • 置信度加权融合
  • 异常值检测和处理

3. 性能评估

  • 精度分析和误差统计
  • 置信度评估
  • 应用场景建议

4. 可视化分析

  • 参数对比显示
  • 信号特征可视化
  • 误差分布分析
posted @ 2025-10-29 11:56  w199899899  阅读(5)  评论(0)    收藏  举报