水声通信Rake接收机-MATLAB

一、系统架构与原理

1.1 水声信道特性

水声信道具有以下特点:

  • 多径效应:声波在海水中反射折射,产生多条传播路径
  • 多普勒频移:由海流、平台运动引起
  • 频率选择性衰落:不同频率衰减不同
  • 长时延扩展:多径时延可达数秒

1.2 Rake接收机原理

复制代码
发射信号 → 水声多径信道 → Rake接收机
                              ↓
                         多径分离
                              ↓
                      匹配滤波(指状接收机)
                              ↓
                      最大比合并(MRC)
                              ↓
                         解调输出

二、MATLAB源代码

2.1 主程序:underwater_rake_main.m

matlab 复制代码
%% 水声通信Rake接收机仿真系统
% 功能:模拟水声信道下的Rake接收机性能

clear; clc; close all;

%% 1. 系统参数设置
params = struct();

% 基本参数
params.Fc = 15e3;           % 载波频率 15 kHz
params.Fs = 96e3;           % 采样率 96 kHz
params.Tsym = 1e-3;         % 符号周期 1 ms
params.Nsym = 1000;         % 符号数量
params.Nbits = params.Nsym * 2; % QPSK每符号2比特

% 扩频参数
params.spreading_factor = 64; % 扩频因子
params.chip_rate = 1/params.Tsym * params.spreading_factor; % 码片速率

% 水声信道参数
params.num_paths = 5;        % 多径数量
params.path_delays = [0, 2, 5, 10, 20] * 1e-3; % 多径时延 (秒)
params.path_gains = [0, -3, -6, -9, -12]; % 多径增益 (dB)
params.doppler_shift = 10;   % 多普勒频移 (Hz)

% Rake接收机参数
params.num_fingers = 4;      % Rake指状接收机数量
params.merge_method = 'MRC'; % 合并方法: 'MRC', 'EGC', 'SC'

fprintf('=== 水声通信Rake接收机仿真 ===\n');
fprintf('载波频率: %.1f kHz\n', params.Fc/1e3);
fprintf('采样率: %.1f kHz\n', params.Fs/1e3);
fprintf('符号速率: %.1f kbps\n', 1/params.Tsym/1e3);
fprintf('扩频因子: %d\n', params.spreading_factor);
fprintf('多径数量: %d\n', params.num_paths);
fprintf('Rake指状接收机数量: %d\n', params.num_fingers);
fprintf('合并方法: %s\n\n', params.merge_method);

%% 2. 生成发射信号
fprintf('生成发射信号...\n');
tx_signal = generate_transmit_signal(params);

%% 3. 通过水声信道
fprintf('通过水声多径信道...\n');
rx_signal = underwater_channel(tx_signal, params);

%% 4. Rake接收机处理
fprintf('Rake接收机处理...\n');
tic;
[demod_bits, rake_output] = rake_receiver(rx_signal, params);
processing_time = toc;
fprintf('Rake处理完成!耗时: %.3f秒\n', processing_time);

%% 5. 性能评估
fprintf('性能评估...\n');
evaluate_performance(tx_signal, rx_signal, demod_bits, params, rake_output);

%% 6. 可视化结果
visualize_results(tx_signal, rx_signal, demod_bits, params, rake_output);

2.2 发射信号生成:generate_transmit_signal.m

matlab 复制代码
function tx_signal = generate_transmit_signal(params)
    % 生成发射信号:随机比特 → QPSK调制 → 扩频
    
    % 1. 生成随机比特流
    tx_bits = randi([0, 1], params.Nbits, 1);
    
    % 2. QPSK调制
    symbols = qpsk_modulate(tx_bits);
    
    % 3. 生成扩频码(Gold序列)
    spreading_codes = generate_gold_codes(params.spreading_factor, params.num_paths);
    
    % 4. 扩频调制
    spread_symbols = zeros(params.Nsym * params.spreading_factor, 1);
    for i = 1:params.Nsym
        symbol = symbols(i);
        code = spreading_codes(1, :).'; % 使用第一个Gold码
        spread_symbols((i-1)*params.spreading_factor+1:i*params.spreading_factor) = symbol * code;
    end
    
    % 5. 脉冲成形(升余弦滤波器)
    rrcos_filter = rcosdesign(0.35, 6, params.spreading_factor);
    tx_signal = upfirdn(spread_symbols, rrcos_filter, params.Fs/params.chip_rate, 1);
    
    % 6. 载波调制
    t = (0:length(tx_signal)-1)' / params.Fs;
    carrier = exp(1j * 2 * pi * params.Fc * t);
    tx_signal = real(tx_signal .* carrier);
    
    fprintf('  发射信号长度: %d 采样点\n', length(tx_signal));
    fprintf('  数据速率: %.2f kbps\n', params.Nbits/params.Nsym/params.Tsym/1e3);
end

function symbols = qpsk_modulate(bits)
    % QPSK调制
    symbols = zeros(length(bits)/2, 1);
    for i = 1:2:length(bits)
        if i+1 <= length(bits)
            symbol = complex(bits(i), bits(i+1));
            % 映射到QPSK星座
            if real(symbol) == 0 && imag(symbol) == 0
                symbols((i+1)/2) = complex(-1, -1)/sqrt(2);
            elseif real(symbol) == 0 && imag(symbol) == 1
                symbols((i+1)/2) = complex(-1, 1)/sqrt(2);
            elseif real(symbol) == 1 && imag(symbol) == 0
                symbols((i+1)/2) = complex(1, -1)/sqrt(2);
            else
                symbols((i+1)/2) = complex(1, 1)/sqrt(2);
            end
        end
    end
end

function codes = generate_gold_codes(length, num_codes)
    % 生成Gold序列作为扩频码
    codes = zeros(num_codes, length);
    
    % 使用两个m序列生成Gold序列
    m1 = generate_m_sequence(length);
    m2 = generate_m_sequence(length);
    
    for i = 1:num_codes
        % 移位m2序列
        shift = mod(i-1, length);
        shifted_m2 = circshift(m2, shift);
        % Gold序列 = m1 ⊕ shifted_m2
        gold_seq = xor(m1, shifted_m2);
        % 转换为双极性
        codes(i, :) = 2*gold_seq - 1;
    end
end

function mseq = generate_m_sequence(length)
    % 生成m序列
    % 使用本原多项式: x^6 + x + 1
    register = ones(1, 6); % 初始寄存器状态
    mseq = zeros(1, length);
    
    for i = 1:length
        mseq(i) = register(end);
        % 反馈计算
        feedback = xor(register(1), register(6));
        register = [feedback, register(1:end-1)];
    end
end

2.3 水声信道模型:underwater_channel.m

matlab 复制代码
function rx_signal = underwater_channel(tx_signal, params)
    % 水声多径信道模型
    
    % 1. 添加多径效应
    rx_signal = zeros(size(tx_signal));
    
    for path = 1:params.num_paths
        % 路径延迟(采样点)
        delay_samples = round(params.path_delays(path) * params.Fs);
        
        % 路径增益(线性)
        gain_linear = 10^(params.path_gains(path)/20);
        
        % 添加延迟和增益
        delayed_signal = [zeros(delay_samples, 1); tx_signal(1:end-delay_samples)];
        rx_signal = rx_signal + gain_linear * delayed_signal;
    end
    
    % 2. 添加多普勒频移
    t = (0:length(rx_signal)-1)' / params.Fs;
    doppler_phase = 2 * pi * params.doppler_shift * t;
    rx_signal = rx_signal .* exp(1j * doppler_phase);
    
    % 3. 添加噪声(水声信道噪声)
    SNR = 10; % 信噪比 (dB)
    signal_power = mean(abs(rx_signal).^2);
    noise_power = signal_power / (10^(SNR/10));
    noise = sqrt(noise_power/2) * (randn(size(rx_signal)) + 1j*randn(size(rx_signal)));
    rx_signal = real(rx_signal + noise);
    
    % 4. 添加频率选择性衰落
    rx_signal = apply_frequency_selective_fading(rx_signal, params);
    
    fprintf('  接收信号SNR: %.1f dB\n', 10*log10(signal_power/noise_power));
    fprintf('  多径时延扩展: %.1f ms\n', max(params.path_delays)*1000);
    fprintf('  多普勒频移: %.1f Hz\n', params.doppler_shift);
end

function signal = apply_frequency_selective_fading(signal, params)
    % 应用频率选择性衰落
    N = length(signal);
    fft_signal = fft(signal);
    
    % 生成频率响应
    freq_response = ones(N, 1);
    for f = 1:N
        freq = (f-1) * params.Fs / N;
        if freq < params.Fc
            attenuation = 1 - 0.1 * (params.Fc - freq) / params.Fc;
        else
            attenuation = 1 - 0.1 * (freq - params.Fc) / params.Fc;
        end
        freq_response(f) = attenuation * exp(1j * 2*pi*rand());
    end
    
    % 应用频率响应
    fft_signal = fft_signal .* freq_response;
    signal = real(ifft(fft_signal));
end

2.4 Rake接收机核心:rake_receiver.m

matlab 复制代码
function [demod_bits, rake_output] = rake_receiver(rx_signal, params)
    % Rake接收机主函数
    
    % 1. 载波解调
    t = (0:length(rx_signal)-1)' / params.Fs;
    carrier = exp(-1j * 2 * pi * params.Fc * t);
    baseband_signal = rx_signal .* carrier;
    
    % 2. 匹配滤波(升余弦滤波)
    rrcos_filter = rcosdesign(0.35, 6, params.spreading_factor);
    matched_signal = upfirdn(baseband_signal, rrcos_filter, 1, params.Fs/params.chip_rate);
    
    % 3. 多径搜索与指状接收机分配
    [path_delays, path_powers] = estimate_multipath(matched_signal, params);
    
    % 4. 初始化Rake指状接收机
    rake_fingers = struct();
    for finger = 1:min(params.num_fingers, length(path_delays))
        rake_fingers(finger).delay = path_delays(finger);
        rake_fingers(finger).power = path_powers(finger);
        rake_fingers(finger).code = generate_gold_codes(params.spreading_factor, 1);
    end
    
    % 5. 每个指状接收机处理
    finger_outputs = zeros(params.Nsym, params.num_fingers);
    
    for finger = 1:min(params.num_fingers, length(path_delays))
        % 对接收信号进行时延补偿
        delay_samples = round(rake_fingers(finger).delay * params.Fs);
        compensated_signal = circshift(matched_signal, delay_samples);
        
        % 解扩
        despread_signal = despread_signal(compensated_signal, rake_fingers(finger).code, params);
        
        % 存储指状接收机输出
        finger_outputs(:, finger) = despread_signal(1:params.Nsym);
    end
    
    % 6. 多径合并
    combined_signal = combine_fingers(finger_outputs, rake_fingers, params.merge_method);
    
    % 7. QPSK解调
    demod_bits = qpsk_demodulate(combined_signal);
    
    % 输出Rake处理结果
    rake_output.finger_outputs = finger_outputs;
    rake_output.combined_signal = combined_signal;
    rake_output.rake_fingers = rake_fingers;
    rake_output.path_delays = path_delays;
    rake_output.path_powers = path_powers;
end

function [delays, powers] = estimate_multipath(signal, params)
    % 估计多径时延和功率
    N = length(signal);
    autocorr = abs(xcorr(signal, signal));
    
    % 找到峰值(多径分量)
    [peaks, locs] = findpeaks(autocorr, 'MinPeakHeight', max(autocorr)*0.1, 'MinPeakDistance', 10);
    
    % 转换为时延
    delays = (locs - N/2) / params.Fs;
    powers = peaks / max(peaks);
    
    % 限制多径数量
    if length(delays) > params.num_fingers
        [~, idx] = sort(powers, 'descend');
        delays = delays(idx(1:params.num_fingers));
        powers = powers(idx(1:params.num_fingers));
    end
    
    fprintf('  检测到 %d 条多径分量\n', length(delays));
    for i = 1:length(delays)
        fprintf('    路径%d: 时延 %.2f ms, 相对功率 %.1f dB\n', ...
                i, delays(i)*1000, 20*log10(powers(i)));
    end
end

function despread_signal = despread_signal(spread_signal, spreading_code, params)
    % 解扩处理
    despread_signal = zeros(params.Nsym, 1);
    
    for sym = 1:params.Nsym
        start_idx = (sym-1)*params.spreading_factor + 1;
        end_idx = sym*params.spreading_factor;
        
        if end_idx <= length(spread_signal)
            chip_block = spread_signal(start_idx:end_idx);
            % 相关解扩
            correlation = sum(chip_block .* spreading_code);
            despread_signal(sym) = correlation;
        end
    end
end

function combined_signal = combine_fingers(finger_outputs, rake_fingers, method)
    % 多径合并
    [Nsym, Nfingers] = size(finger_outputs);
    combined_signal = zeros(Nsym, 1);
    
    switch method
        case 'MRC' % 最大比合并
            weights = zeros(Nfingers, 1);
            for finger = 1:Nfingers
                weights(finger) = rake_fingers(finger).power;
            end
            for sym = 1:Nsym
                combined_signal(sym) = sum(conj(weights) .* finger_outputs(sym, :).') / sum(abs(weights).^2);
            end
            
        case 'EGC' % 等增益合并
            for sym = 1:Nsym
                combined_signal(sym) = sum(finger_outputs(sym, :)) / Nfingers;
            end
            
        case 'SC' % 选择合并
            for sym = 1:Nsym
                [~, best_finger] = max(abs(finger_outputs(sym, :)));
                combined_signal(sym) = finger_outputs(sym, best_finger);
            end
    end
end

function bits = qpsk_demodulate(symbols)
    % QPSK解调
    bits = zeros(length(symbols)*2, 1);
    
    for i = 1:length(symbols)
        symbol = symbols(i);
        
        % 判断象限
        if real(symbol) >= 0 && imag(symbol) >= 0
            bits(2*i-1) = 1; bits(2*i) = 1;
        elseif real(symbol) < 0 && imag(symbol) >= 0
            bits(2*i-1) = 0; bits(2*i) = 1;
        elseif real(symbol) < 0 && imag(symbol) < 0
            bits(2*i-1) = 0; bits(2*i) = 0;
        else
            bits(2*i-1) = 1; bits(2*i) = 0;
        end
    end
end

2.5 性能评估:evaluate_performance.m

matlab 复制代码
function evaluate_performance(tx_signal, rx_signal, demod_bits, params, rake_output)
    % 性能评估函数
    
    % 1. 误码率计算
    original_bits = generate_original_bits(params);
    if length(original_bits) >= length(demod_bits)
        original_bits = original_bits(1:length(demod_bits));
    else
        demod_bits = demod_bits(1:length(original_bits));
    end
    
    ber = sum(original_bits ~= demod_bits) / length(original_bits);
    
    % 2. 信噪比改善
    rx_power = mean(abs(rx_signal).^2);
    noise_power = mean(abs(rx_signal - tx_signal(1:length(rx_signal))).^2);
    input_snr = 10*log10(rx_power / noise_power);
    
    % Rake输出信噪比
    rake_power = mean(abs(rake_output.combined_signal).^2);
    rake_noise_power = mean(abs(rake_output.combined_signal - mean(rake_output.combined_signal)).^2);
    output_snr = 10*log10(rake_power / rake_noise_power);
    
    % 3. 多径分集增益
    diversity_gain = output_snr - input_snr;
    
    % 4. 处理增益
    processing_gain = 10*log10(params.spreading_factor);
    
    fprintf('\n=== 性能评估结果 ===\n');
    fprintf('误码率 (BER): %.2e\n', ber);
    fprintf('输入信噪比: %.1f dB\n', input_snr);
    fprintf('Rake输出信噪比: %.1f dB\n', output_snr);
    fprintf('多径分集增益: %.1f dB\n', diversity_gain);
    fprintf('处理增益: %.1f dB\n', processing_gain);
    fprintf('数据速率: %.2f kbps\n', params.Nbits/params.Nsym/params.Tsym/1e3);
    
    % 5. 理论误码率(AWGN信道)
    theoretical_ber = 0.5 * erfc(sqrt(10^(output_snr/10)));
    fprintf('理论误码率 (AWGN): %.2e\n', theoretical_ber);
    
    if ber < 1e-3
        fprintf('✓ 系统性能优秀 (BER < 10^-3)\n');
    elseif ber < 1e-2
        fprintf('○ 系统性能良好 (BER < 10^-2)\n');
    else
        fprintf('⚠ 系统性能需改进 (BER ≥ 10^-2)\n');
    end
end

function original_bits = generate_original_bits(params)
    % 重新生成原始比特用于对比
    original_bits = randi([0, 1], params.Nbits, 1);
end

2.6 结果可视化:visualize_results.m

matlab 复制代码
function visualize_results(tx_signal, rx_signal, demod_bits, params, rake_output)
    % 可视化结果
    
    figure('Name', '水声通信Rake接收机仿真结果', 'Color', 'white', 'Position', [100, 100, 1400, 800]);
    
    % 1. 发射信号时域波形
    subplot(3,4,1);
    t_tx = (0:min(1000,length(tx_signal))-1) / params.Fs * 1000;
    plot(t_tx, real(tx_signal(1:min(1000,length(tx_signal)))));
    xlabel('时间 (ms)'); ylabel('幅度');
    title('发射信号时域波形'); grid on;
    
    % 2. 接收信号时域波形
    subplot(3,4,2);
    t_rx = (0:min(1000,length(rx_signal))-1) / params.Fs * 1000;
    plot(t_rx, rx_signal(1:min(1000,length(rx_signal))));
    xlabel('时间 (ms)'); ylabel('幅度');
    title('接收信号时域波形'); grid on;
    
    % 3. 接收信号频谱
    subplot(3,4,3);
    N = length(rx_signal);
    f = (-N/2:N/2-1) * params.Fs / N / 1000;
    spectrum = fftshift(abs(fft(rx_signal)));
    plot(f, 20*log10(spectrum/max(spectrum)));
    xlabel('频率 (kHz)'); ylabel('幅度 (dB)');
    title('接收信号频谱'); grid on;
    xlim([-20, 20]);
    
    % 4. 多径功率延迟分布
    subplot(3,4,4);
    stem(rake_output.path_delays*1000, 20*log10(rake_output.path_powers), 'filled');
    xlabel('时延 (ms)'); ylabel('相对功率 (dB)');
    title('多径功率延迟分布'); grid on;
    
    % 5. Rake指状接收机输出
    subplot(3,4,5);
    plot(real(rake_output.finger_outputs), 'LineWidth', 1.5);
    xlabel('符号序号'); ylabel('幅度');
    title('Rake指状接收机输出'); grid on;
    legend('指状1', '指状2', '指状3', '指状4', 'Location', 'best');
    
    % 6. Rake合并后信号
    subplot(3,4,6);
    plot(real(rake_output.combined_signal), 'b-', 'LineWidth', 1.5);
    xlabel('符号序号'); ylabel('幅度');
    title('Rake合并后信号'); grid on;
    
    % 7. 星座图
    subplot(3,4,7);
    scatter(real(rake_output.combined_signal), imag(rake_output.combined_signal), 10, 'filled');
    xlabel('同相分量'); ylabel('正交分量');
    title('Rake输出星座图'); grid on;
    axis equal;
    
    % 8. 误码率随信噪比变化
    subplot(3,4,8);
    snr_range = -10:2:20;
    theoretical_ber = 0.5 * erfc(sqrt(10.^(snr_range/10)));
    semilogy(snr_range, theoretical_ber, 'b-', 'LineWidth', 2);
    xlabel('信噪比 (dB)'); ylabel('误码率 (BER)');
    title('理论误码率曲线'); grid on;
    
    % 9. 多普勒频移影响
    subplot(3,4,9);
    doppler_range = 0:5:50;
    ber_doppler = zeros(size(doppler_range));
    for i = 1:length(doppler_range)
        ber_doppler(i) = 0.5 * erfc(sqrt(10.^(15/10))) * (1 + doppler_range(i)/100);
    end
    plot(doppler_range, ber_doppler, 'r-', 'LineWidth', 2);
    xlabel('多普勒频移 (Hz)'); ylabel('误码率 (BER)');
    title('多普勒频移对BER的影响'); grid on;
    
    % 10. 扩频因子影响
    subplot(3,4,10);
    sf_range = [4, 8, 16, 32, 64, 128];
    processing_gain = 10*log10(sf_range);
    ber_sf = 0.5 * erfc(sqrt(10.^(15/10) * sf_range/64));
    semilogy(sf_range, ber_sf, 'g-o', 'LineWidth', 2, 'MarkerSize', 8);
    xlabel('扩频因子'); ylabel('误码率 (BER)');
    title('扩频因子对BER的影响'); grid on;
    
    % 11. 合并方法比较
    subplot(3,4,11);
    merge_methods = {'MRC', 'EGC', 'SC'};
    ber_merge = [1e-4, 5e-4, 2e-3]; % 示例数据
    bar(1:3, ber_merge, 'FaceColor', 'cyan');
    set(gca, 'XTickLabel', merge_methods);
    xlabel('合并方法'); ylabel('误码率 (BER)');
    title('不同合并方法的BER比较'); grid on;
    
    % 12. 系统参数表
    subplot(3,4,12); axis off;
    param_text = {
        sprintf('载波频率: %.1f kHz', params.Fc/1e3)
        sprintf('采样率: %.1f kHz', params.Fs/1e3)
        sprintf('符号速率: %.1f kbps', 1/params.Tsym/1e3)
        sprintf('扩频因子: %d', params.spreading_factor)
        sprintf('多径数量: %d', params.num_paths)
        sprintf('Rake指状数: %d', params.num_fingers)
        sprintf('合并方法: %s', params.merge_method)
        sprintf('多普勒频移: %.1f Hz', params.doppler_shift)
    };
    text(0.1, 0.9, '系统参数配置:', 'FontSize', 12, 'FontWeight', 'bold');
    for i = 1:length(param_text)
        text(0.1, 0.9 - i*0.1, param_text{i}, 'FontSize', 10);
    end
    title('系统配置信息');
end

三、扩展功能模块

3.1 自适应Rake接收机

matlab 复制代码
function adaptive_rake_receiver(rx_signal, params)
    % 自适应Rake接收机(使用LMS算法调整权重)
    
    % 初始化
    Nfingers = params.num_fingers;
    weights = ones(Nfingers, 1) / Nfingers; % 初始权重
    mu = 0.01; % 步长
    
    % 估计多径
    [delays, ~] = estimate_multipath(rx_signal, params);
    
    % 自适应调整
    for iteration = 1:1000
        % 计算误差
        error = desired_signal - actual_output;
        
        % 更新权重
        weights = weights + mu * error * conj(finger_outputs(iteration, :).');
        
        % 归一化
        weights = weights / norm(weights);
    end
end

3.2 空时Rake接收机

matlab 复制代码
function space_time_rake(rx_signals, params)
    % 空时Rake接收机(多天线接收)
    % rx_signals: 多天线接收信号 [天线数 × 信号长度]
    
    Nantennas = size(rx_signals, 1);
    Nfingers = params.num_fingers;
    
    % 联合空时处理
    for antenna = 1:Nantennas
        for finger = 1:Nfingers
            % 空时权重计算
            weight = calculate_space_time_weight(antenna, finger);
            % 信号合并
            combined_signal = combined_signal + weight * rx_signals(antenna, :);
        end
    end
end

参考代码 水声通信Rake接收机matlab源代码 www.youwenfan.com/contentcsu/60121.html

四、实际应用建议

4.1 水声通信系统设计要点

  1. 载波频率选择:根据水深和传播距离选择(浅水:10-20kHz,深水:5-10kHz)
  2. 扩频因子优化:权衡抗干扰能力和数据速率
  3. 多普勒补偿:使用前导序列估计和补偿多普勒频移
  4. 信道估计:定期更新信道状态信息

4.2 性能优化建议

优化方向 具体措施 预期改善
抗多径 增加Rake指状接收机数量 分集增益提升
抗噪声 优化扩频码和合并方法 信噪比改善
抗多普勒 自适应多普勒补偿 频偏容限扩大
实时性 简化Rake结构,使用FFT实现 计算复杂度降低

4.3 硬件实现注意事项

  1. ADC采样率:至少满足奈奎斯特采样定理,建议过采样
  2. FPGA实现:使用流水线结构实现Rake接收机
  3. 同步精度:需要精确的符号同步和载波同步
  4. 功耗控制:根据应用场景优化算法复杂度
相关推荐
yuanpan1 小时前
Python + sqlite3 本地 SQLite 数据库操作实战:完整 CRUD 入门教程
开发语言·python·opencv
sindyra1 小时前
享元模式(Flyweight Pattern)
java·开发语言·设计模式·享元模式·优缺点
codingPower1 小时前
ApplicationListener 和 SpringApplicationRunListener 深度解析对比
java·开发语言·spring boot
机器学习之心1 小时前
电池SOH估计和RUL预测,基于GRU门控循环单元的锂电池健康状态估计和剩余寿命预测,MATLAB代码
深度学习·matlab·gru·门控循环单元·锂电池健康状态估计
ch.ju1 小时前
Java Programming Chapter 2-Recursion of function
java·开发语言
yuanpan1 小时前
Python + matplotlib 数据可视化入门教程:折线图、柱状图、饼图与 Excel 绘图
开发语言·python·opencv
Highcharts.js1 小时前
Highcharts 助力医疗与生命科学研究的数据分析|让医学数据轻易呈现
开发语言·信息可视化·highcharts·实战代码·响应式图表
程序员小白条1 小时前
AI 编程辅助,从入门到真香
java·开发语言·数据库·人工智能·面试·职场和发展
ErizJ1 小时前
Go|腾讯面经总结
开发语言·后端·golang