活动介绍

% 参数设置 fs = 1000; % 采样率 t = 0:1/fs:1; % 时间向量 fc = 50; % 载波频率 fm = 5; % 基带信号频率 kf = 5; % 频率偏移系数 % 基带信号 m(t) m_t = sin(2*pi*fm*t); % FM 调制信号 s_FM(t) phi_c = 0; % 初始相位 integral_m_t = cumtrapz(t, m_t); % 对 m(t) 进行数值积分 s_FM = cos(2*pi*fc*t + kf*integral_m_t + phi_c); % 绘图 figure; subplot(3,1,1); plot(t, m_t); grid on; xlabel('时间 t'); ylabel('m(t)'); title('基带信号'); subplot(3,1,2); plot(t, cos(2*pi*fc*t)); grid on; xlabel('时间 t'); ylabel('c(t)'); title('载波信号'); subplot(3,1,3); plot(t, s_FM); grid on; xlabel('时间 t'); ylabel('s_{FM}(t)'); title('FM 调制信号'); 用matlab写一段代码,在该调制信号上添加awgn噪声和多径衰落模拟(两径模型),并绘制结果波形

时间: 2025-03-19 20:10:07 浏览: 87
<think>好的,我需要帮用户在已有的FM调制信号基础上,用MATLAB添加AWGN噪声和两径模型的多径衰落,并绘制结果波形。首先,我应该回顾一下FM调制的基本步骤,然后考虑如何添加噪声和多径效应。 用户提到了AWGN和两径模型。AWGN在MATLAB中通常用awgn函数实现,而多径效应可能需要用到comm.RicianChannel或者comm.RayleighChannel,但根据引用中的例子,用户之前可能用过comm.RicianChannel,不过这里两径模型可能更适合两径的情况。可能需要自定义多径参数,比如延迟和增益。例如,引用3中的例子使用了三个路径,但用户需要的是两径,所以需要调整PathDelays和AveragePathGains。 首先,生成FM信号。可能需要先生成基带信号,然后进行调制。不过FM调制在MATLAB中可以用fmmod函数,需要指定载波频率、采样率等参数。 然后,添加AWGN噪声。awgn函数需要指定信噪比,可能需要计算信号功率。或者用户可以直接指定SNR的值。 接下来是多径衰落。两径模型可能需要设置两个延迟路径,比如[0 delay]/fs,对应的增益可能为[0 gain_dB]。例如,主路径延迟0,增益0dB,第二路径延迟比如1个样本时间,增益-3dB。或者根据用户需求调整。需要创建一个合适的多径信道对象,比如使用comm.RicianChannel或comm.RayleighChannel,或者直接构建一个FIR滤波器模拟两径效应。 然后,处理后的信号需要绘制时域波形,可能需要使用subplot分别显示原始FM信号、加噪后的信号、多径后的信号,以及叠加两者的信号。 需要注意的是,多径信道可能会引入延迟,导致信号长度变化,可能需要处理。例如,使用filter函数时,可能需要截断或补偿延迟。或者使用comm.RicianChannel这样的系统对象,会自动处理。 可能的步骤结构: 1. 生成FM调制信号。 2. 添加AWGN噪声。 3. 应用两径多径效应。 4. 绘制各阶段波形。 代码部分需要包含这些步骤。例如: - 使用fmmod生成FM信号。 - 使用awgn添加噪声。 - 创建多径信道对象,设置两径参数,如PathDelays和AveragePathGains为两元素数组。 - 通过信道处理信号。 - 绘图部分使用plot函数,设置时间轴,可能需要归一化时间显示。 另外,可能需要调整信噪比的值,或者让用户根据实际情况调整参数。例如,SNR设为10dB,多径的延迟设为1个样本时间,增益设为-3dB和0dB。或者根据引用3中的例子,设置合理的参数。 需要确保代码中的变量如fs(采样率)、fc(载波频率)等已经正确定义。如果用户已有FM信号,可能需要用户提供生成该信号的代码,或者假设生成一个示例FM信号。 最后,绘图部分可能需要将时间轴转换为毫秒或微秒以便观察,特别是如果信号持续时间较长的话。使用subplot来分开展示不同阶段的信号波形。 需要验证代码的正确性,例如awgn函数的使用是否正确,多径信道参数是否设置正确。可能需要注意信号是实信号还是复信号,多径信道是否适合处理该类型的信号。 总结步骤: 1. 生成基带信号和FM调制。 2. 添加AWGN噪声。 3. 应用两径多径模型。 4. 绘制原始、加噪、多径以及同时加噪和多径的信号波形。</think>在MATLAB中为FM调制信号添加AWGN噪声和两径多径效应,可按照以下步骤实现: --- ### **步骤1:生成FM调制信号** ```matlab fs = 100e3; % 采样率100kHz fc = 20e3; % 载波频率20kHz t = 0:1/fs:0.01; % 时间序列(10ms) fm = 1000; % 基带信号频率1kHz A = 1; % 基带信号幅度 % 生成基带信号 baseband = A*cos(2*pi*fm*t); % FM调制 deviation = 10e3; % 频偏10kHz fm_signal = fmmod(baseband, fc, fs, deviation); ``` --- ### **步骤2:添加AWGN噪声** ```matlab SNR = 20; % 信噪比20dB noisy_signal = awgn(fm_signal, SNR, 'measured'); ``` --- ### **步骤3:构建两径多径信道** 使用`comm.RicianChannel`或自定义两径模型: ```matlab % 定义两径参数 pathDelays = [0 1]/fs; % 延迟:[0样本, 1样本] avgPathGains = [0 -3]; % 平均增益:0dB和-3dB KFactor = 4; % 莱斯因子(主径存在直射路径) % 创建多径信道对象 multipathChannel = comm.RicianChannel(... 'SampleRate', fs, ... 'PathDelays', pathDelays, ... 'AveragePathGains', avgPathGains, ... 'KFactor', KFactor, ... 'MaximumDopplerShift', 0); % 静止场景,无多普勒 % 通过多径信道 multipath_signal = multipathChannel(fm_signal.').'; ``` --- ### **步骤4:叠加噪声和多径效应** ```matlab % 叠加噪声和多径 combined_signal = multipathChannel(noisy_signal.').'; ``` --- ### **步骤5:绘制波形** ```matlab figure; subplot(4,1,1); plot(t, fm_signal); title('原始FM信号'); xlabel('时间(s)'); subplot(4,1,2); plot(t, noisy_signal); title('添加AWGN噪声后的信号'); xlabel('时间(s)'); subplot(4,1,3); plot(t, multipath_signal); title('仅多径效应后的信号'); xlabel('时间(s)'); subplot(4,1,4); plot(t, combined_signal); title('噪声+多径后的信号'); xlabel('时间(s)'); ``` --- ### **关键解释** 1. **AWGN噪声**:通过`awgn`函数直接添加,`SNR`参数控制信噪比[^1]。 2. **两径模型**:使用`comm.RicianChannel`定义两径参数,模拟主径和反射径的叠加效应[^3]。 3. **信号叠加**:多径效应会引入延迟和幅度变化,与AWGN噪声共同影响信号质量。 ---
阅读全文

相关推荐

% 参数设置 fm = 5; % 信源频率 fc = 50; % 载波频率 fs = 1000; % 采样频率 t = 0:1/fs:1-1/fs; % 时间向量 N0 = 0.01; % 白噪声单边功率谱密度 % 信源 mt = sqrt(2)*cos(2*pi*fm*t); % 信源 % DSB 调制 s_dsb = mt .* cos(2*pi*fc*t); % DSB 调制 % 添加窄带高斯噪声 noise = noise_nb(fc, 2*fm, N0, t); % 窄带高斯噪声产生 s_dsb = s_dsb + noise; % DSB 相干解调 rt = s_dsb .* cos(2*pi*fc*t); % 相干解调 rt = rt - mean(rt); % 傅里叶变换 [f, rf] = T2F(t, rt); % 低通滤波 [t, rt] = lpf(f, rf, 2*fm); % 低通滤波 % 绘制结果 figure; subplot(3,1,1); plot(t, mt); title('信源信号'); xlabel('时间 (s)'); ylabel('幅度'); subplot(3,1,2); plot(t, s_dsb); title('DSB 调制信号'); xlabel('时间 (s)'); ylabel('幅度'); subplot(3,1,3); plot(t, rt); title('解调信号'); xlabel('时间 (s)'); ylabel('幅度'); % 生成窄带高斯噪声的函数 function noise = noise_nb(fc, B, N0, t) % fc: 载波频率 % B: 噪声带宽 % N0: 白噪声单边功率谱密度 % t: 时间向量 n = length(t); % 生成零均值单位方差的复高斯噪声 complex_noise = (randn(n,1) + 1i*randn(n,1))/sqrt(2); % 计算噪声的功率谱密度 noise_psd = N0/2; % 计算噪声的幅度 noise_amplitude = sqrt(noise_psd*B); % 生成窄带高斯噪声 noise = real(noise_amplitude*complex_noise.*exp(1i*2*pi*fc*t)); end % 傅里叶变换的函数 function [f, rf] = T2F(t, x) N = length(t); dt = t(2) - t(1); f = (0:N-1)*(1/(N*dt)) - 1/(2*dt); rf = fftshift(fft(x)); rf = rf/N; end % 低通滤波的函数 function [t, y] = lpf(f, rf, cutoff_freq) % f: 频率向量 % rf: 频谱 % cutoff_freq: 截止频率 N = length(f); idx = abs(f) <= cutoff_freq; filtered_rf = zeros(N,1); filtered_rf(idx) = rf(idx); y = ifft(ifftshift(filtered_rf))*N; t = 0:1/(N-1):1; end 无法识别noise nb 函数,修改代码让它成功运行

%% BPSK通信系统仿真 clear; clc; close all; % ========== 系统参数 ========== Fs = 1e6; % 采样率1MHz fc = 100e3; % 载波频率100kHz bit_rate = 10e3; % 比特率10kbps n_bits = 1024; % 传输比特数 EbN0_dB = 0:2:10; % 信噪比范围(dB) % ========== 信号生成 ========== bits = randi([0 1], 1, n_bits); % 随机比特流 sps = Fs/bit_rate; % 每符号采样数 % ========== BPSK调制 ========== % 符号映射:0->+1, 1->-1 symbols = 1 - 2*bits; % 升余弦脉冲成形 rolloff = 0.35; span = 6; rrc_filter = rcosdesign(rolloff, span, sps); tx_baseband = upfirdn(symbols, rrc_filter, sps); % 载波调制 t = (0:length(tx_baseband)-1)/Fs; tx_signal = real(tx_baseband) .* cos(2*pi*fc*t); % ========== 信道传输 ========== ber_sim = zeros(size(EbN0_dB)); for k = 1:length(EbN0_dB) % 添加高斯白噪声 rx_signal = awgn(tx_signal, EbN0_dB(k), 'measured'); % ========== BPSK解调 ========== % 相干解调 I = rx_signal .* cos(2*pi*fc*t) * 2; % 匹配滤波 I_filt = upfirdn(I, rrc_filter, 1, sps); rx_syms = I_filt(span+1:end-span); % 判决 demod_bits = rx_syms < 0; % 误码率计算 ber_sim(k) = sum(bits ~= demod_bits(1:n_bits))/n_bits; end % ========== 理论误码率 ========== ber_theory = berawgn(EbN0_dB, 'psk', 2, 'nondiff'); % ========== 结果可视化 ========== figure; subplot(311); stem(bits(1:50)); title('原始比特流'); subplot(312); plot(tx_signal(1:500)); title('调制信号波形'); subplot(313); plot(rx_signal(1:500)); title('接收信号波形'); figure; semilogy(EbN0_dB, ber_sim, 'ro-', EbN0_dB, ber_theory, 'b-'); legend('仿真误码率', '理论误码率'); xlabel('Eb/N0 (dB)'); ylabel('误码率'); title('BPSK系统性能曲线'); grid on; 需要添加解调波形

将下列代码中的基带8-PSK更换为4-PSK:clear all nsymbol=10000; %每种信噪比下的发送符号数 T=1; %符号周期 fs=100; %每个符号的采样点数 ts=1/fs; %采样时间间隔 t=0:ts:T-ts; %时间向量 fc=10; %载波频率 c=sqrt(2/T)*exp(j*2*pi*fc*t); %载波信号 c1=sqrt(2/T)*cos(2*pi*fc*t); %同相载波 c2=-sqrt(2/T)*sin(2*pi*fc*t); %正交载波 M=8; %8-PSK graycode=[0 1 2 3 6 7 4 5]; %Gray编码规则 EsN0=0:15; %信噪比,Es/N0 snr1=10.^(EsN0/10); %信噪比转换为线性值 msg=randint(1,nsymbol,M); %消息数据 msg1=graycode(msg+1); %Gray映射 msgmod=pskmod(msg1,M).'; %基带8-PSK调制 tx=real(msgmod*c); %载波调制 tx1=reshape(tx.',1,length(msgmod)*length(c)); spow=norm(tx1).^2/nsymbol; %求每个符号的平均功率 for indx=1:length(EsN0) sigma=sqrt(spow/(2*snr1(indx))); %根据符号功率求噪声功率 rx=tx1+sigma*randn(1,length(tx1)); %加入高斯白噪声 rx1=reshape(rx,length(c),length(msgmod)); r1=(c1*rx1)/length(c1); %相关运算 r2=(c2*rx1)/length(c2); r=r1+j*r2; y=pskdemod(r,M); %PSK解调 decmsg=graycode(y+1); [err,ber(indx)]=biterr(msg,decmsg,log2(M)); %误比特率 [err,ser(indx)]=symerr(msg,decmsg); %误符号率 end ser1=2*qfunc(sqrt(2*snr1)*sin(pi/M)); %理论误符号率 ber1=1/log2(M)*ser1; %理论误比特率 semilogy(EsN0,ber,'-ko',EsN0,ser,'-k*',EsN0,ser1,EsN0,ber1,'-k.'); title('8-PSK载波调制信号在AWGN信道下的性能') xlabel('Es/N0');ylabel('误比特率和误符号率') legend('误比特率','误符号率','理论误符号率','理论误比特率')

% 参数设置 fm = 5; % 基带信号频率 (Hz) fc = 100; % 载波频率 (Hz) A = 2; % 载波幅度 N0 = 0.01; % 噪声单边功率谱密度 B = 2 * fm; % 噪声带宽 fs = 10 * fc; % 采样频率 t = 0:1/fs:1-1/fs; % 时间向量 (1秒) % 信源信号 mt = sqrt(2) * cos(2 * pi * fm * t); % 基带信号 % AM调制 s_am = (A + mt) .* cos(2 * pi * fc * t); % AM调制信号 % 窄带高斯噪声生成 noise = noise_nb(fc, B, N0, t); % 生成窄带噪声 s_am_noisy = s_am + noise; % 添加噪声 % AM解调 rt = s_am_noisy .* cos(2 * pi * fc * t); % 相干解调 rt = rt - mean(rt); % 去除直流分量 % 傅里叶变换 [f, rf] = T2F(t, rt); % 将解调信号转换到频域 % 低通滤波 [t, rt_filtered] = lpf(f, rf, fm); % 低通滤波,截止频率为 fm % 绘图 figure; subplot(3, 1, 1); plot(t, mt); title('基带信号 m(t)'); xlabel('时间 (s)'); ylabel('幅度'); subplot(3, 1, 2); plot(t, s_am_noisy); title('AM调制信号 + 噪声'); xlabel('时间 (s)'); ylabel('幅度'); subplot(3, 1, 3); plot(t, rt_filtered); title('解调后的基带信号'); xlabel('时间 (s)'); ylabel('幅度'); % 辅助函数:傅里叶变换 function [f, sf] = T2F(t, st) dt = t(2) - t(1); T = t(end); df = 1 / T; N = length(st); f = (-N/2 : N/2-1) * df; % 频率向量 sf = fft(st); sf = fftshift(sf) * dt; % 傅里叶变换结果 end % 辅助函数:低通滤波 function [t, st] = lpf(f, sf, B) df = f(2) - f(1); hf = zeros(1, length(f)); % 初始化滤波器 hf(abs(f) <= B) = 1; % 矩形低通滤波器 yf = hf .* sf; % 频域滤波 [t, st] = F2T(f, yf); % 逆傅里叶变换 st = real(st); % 取实部 end % 辅助函数:逆傅里叶变换 function [t, st] = F2T(f, sf) df = f(2) - f(1); N = length(sf); t = (0 : N-1) / (N * df); % 时间向量 st = ifft(ifftshift(sf)) * N * df; % 逆傅里叶变换 end % 辅助函数:窄带高斯噪声生成 function [out] = noise_nb(fc, B, N0, t) dt = t(2) - t(1); Fmx = 1 / dt; % 采样频率 n_len = length(t); p = N0 * Fmx / 2; % 噪声方差 rn = sqrt(p) * randn(1, n_len); % 生成白噪声 [f, rf] = T2F(t, rn); % 转换到频域 [t, out] = bpf(f, rf, fc - B/2, fc + B/2); % 带通滤波 end % 辅助函数:带通滤波 function [t, st] = bpf(f, sf, f1, f2) df = f(2) - f(1); hf = zeros(1, length(f)); % 初始化滤波器 hf((f >= f1) & (f <= f2)) = 1; % 矩形带通滤波器 hf((f <= -f1) & (f >= -f2)) = 1; % 对称负频率部分 yf = hf .* sf; % 频域滤波 [t, st] = F2T(f, yf); % 逆傅里叶变换 st = real(st); % 取实部 end为什么这个matlab程序每次运行后解调后的基带图像都不一样

%% 参数设置 fc = 1000; % 载波频率 (Hz) fs = 20*fc; % 采样频率 (Hz) chip_duration = 0.01; % 每个码片持续时间 (秒) m_order = 5; % m序列阶数 (序列长度 = 2^m_order - 1) %% 生成m序列 taps = [5, 2]; % 本原多项式抽头位置 (x^5 + x^2 + 1) register = ones(1, max(taps)); % 移位寄存器初始状态 m_sequence = zeros(1, 2^m_order-1); % 预分配空间 for i = 1:length(m_sequence) % 计算反馈位 (异或操作) feedback = mod(sum(register(taps)), 2); % 输出当前位 m_sequence(i) = register(end); % 移位寄存器更新 register(2:end) = register(1:end-1); register(1) = feedback; end %% 生成基带信号 t_chip = 0:1/fs:chip_duration-1/fs; % 单个码片时间向量 baseband = repelem(m_sequence, length(t_chip)); % 扩展m序列 %% 生成载波信号 t_total = (0:length(baseband)-1)/fs; % 总时间向量 carrier = cos(2*pi*fc*t_total); % 载波信号 %% BPSK调制 % 映射:0 -> +1, 1 -> -1 modulated_signal = (1 - 2*baseband) .* carrier; %% 绘制信号 figure('Position', [100, 100, 1000, 800]) % 1. m序列(基带信号) subplot(3,1,1) plot(t_total, baseband, 'LineWidth', 1.5) title('m序列(基带信号)') xlabel('时间 (s)') ylabel('幅度') ylim([-0.2 1.2]) grid on % 2. 载波信号 subplot(3,1,2) plot(t_total, carrier, 'LineWidth', 1.5) title('载波信号') xlabel('时间 (s)') ylabel('幅度') xlim([0, 3/fc]) % 显示前3个载波周期 grid on % 3. BPSK调制信号 subplot(3,1,3) plot(t_total, modulated_signal, 'LineWidth', 1.5) title('BPSK调制信号') xlabel('时间 (s)') ylabel('幅度') xlim([0, 3*chip_duration]) % 显示前3个码片 grid on 这段代码中的modulated_signal,在经过m序列扩频调制后,为什么相位没有发生反转

function [RD, r_axis, v_axis] = rd_ECABatch(surv, refsig, fs, b, K, N_range, N_doppler, fc) % rd_ECABatch — ECA-Batch 干扰抑制后的 Range-Doppler 图 % surv, refsig: 列向量输入;fs: 采样率;b: 分批数; % K: 干扰子空间大小;N_range, N_doppler: 输出图大小; % fc: 载波频率。 c = 3e8; % 光速 lambda = c/fc; % 波长 NB = floor(length(surv)/b); % 每批样本数 TB = NB/fs; % 每批时间长度 % 距离刻度 r_res = c/(2*fs); r_axis = (0:N_range-1)' * r_res; % 多普勒刻度(慢时域采样 fs_slow = 1/TB) fs_slow = 1/TB; f_res = fs_slow / N_doppler; f_axis = ((0:N_doppler-1) - N_doppler/2) * f_res; v_axis = (lambda/2) * f_axis; eps_reg = 1e-6; % 正则化因子 Cmat = zeros(N_range, b); % 预分配 for i = 1:b idx = (i-1)*NB + (1:NB); % 确保是列向量 x = surv(idx).'; % NB×1 y = refsig(idx).'; % NB×1 % 构造 NB×K 的干扰子空间矩阵 X X = zeros(NB, K); for k = 0:(K-1) X(k+1:NB, k+1) = y(1:NB-k); end % 最小二乘解 + 正则化 R_xx = X' * X + eps_reg * eye(K); w = R_xx \ (X' * x); % K×1 % 干净信号 s_eca = x - X * w; % NB×1 % slow-time cross-correlation C = xcorr(s_eca, y, NB-1, 'none'); % 取零延迟开始的 N_range 样点 Cmat(:, i) = C(NB : NB+N_range-1); end % 对每行(range bin)做 FFT → Doppler 维度 RD = fftshift( fft(Cmat, N_doppler, 2), 2 ); end % % function [RD, r_axis, v_axis] = rd_ECABatch(surv, refsig, fs, b, K, N_range, N_doppler, fc) % % c = 3e8; % lambda = c/fc; % % NB = floor(length(surv)/b); % TB = NB/fs; % % r_res = c/(2*fs); % r_axis = (0:N_range-1)' * r_res; % % fs_slow = 1/TB; % f_res = fs_slow / N_doppler; % f_axis = ((0:N_doppler-1) - N_doppler/2) * f_res; % v_axis = (lambda/2) * f_axis; % % eps_reg = 1e-6; % Cmat = zeros(N_range, b); % % for i = 1:b % idx = (i-1)*NB + (1:NB); % x = surv(idx).'; % y = refsig(idx).'; % % 构造干扰子空间 % X = zeros(NB, K); % for k = 0:(K-1) % X(k+1:end, k+1) = y(1:end-k); % end % % 投影子空间 % alpha = (X'*X + eps_reg*eye(K)) \ (X'*x); % clean = x - X*alpha; % % C = xcorr(clean, y, NB-1, 'none'); % Cmat(:, i) = C(NB:NB+N_range-1); % end % % RD = fftshift(fft(Cmat, N_doppler, 2), 2); % % end 这是我的eca部分

%% 参数设置 clear all; close all; clc; Fs = 5e9; % 采样率 5 GHz fc = 1e9; % 载波频率 1 GHz bw = 5e6; % 信号带宽 5 MHz duration = 200e-6; % 信号持续时间 200 μs t = 0:1/Fs:duration-1/Fs; %% 生成QPSK调制信号 fprintf('生成QPSK调制信号...\n'); symbol_rate = bw; % 符号率 5 MHz sps = floor(Fs/symbol_rate); % 每符号采样点数 num_symbols = ceil(length(t)/sps); data = randi([0 3], 1, num_symbols); % QPSK数据 modulated = pskmod(data, 4, pi/4); % QPSK调制 % 升余弦滤波 rolloff = 0.35; filt = rcosdesign(rolloff, 6, sps); baseband = upfirdn(modulated, filt, sps, 1); baseband = baseband(1:length(t)); %% 上变频 fprintf('上变频到RF...\n'); carrier = exp(1i*2*pi*fc*t); rf_signal = real(baseband .* carrier); %% 添加噪声 fprintf('添加噪声...\n'); noise_power = 0.01 * var(rf_signal); rf_signal = rf_signal + sqrt(noise_power)*randn(size(rf_signal)); %% 定点量化 (16位有符号) fprintf('定点量化...\n'); nbits = 16; max_val = 2^(nbits-1)-1; rf_signal_normalized = rf_signal / max(abs(rf_signal)); rf_fixed = round(rf_signal_normalized * max_val); rf_fixed(rf_fixed > max_val) = max_val; rf_fixed(rf_fixed < -max_val) = -max_val; %% 重组为16路并行数据 fprintf('重组为16路并行数据...\n'); num_samples = length(rf_fixed); % 确保总样本数是16*8=128的倍数(满足CIC抽取要求) block_multiple = 16*8; % 16路并行 * 8倍CIC抽取 if mod(num_samples, block_multiple) ~= 0 padding = block_multiple - mod(num_samples, block_multiple); rf_fixed = [rf_fixed, zeros(1, padding)]; num_samples = length(rf_fixed); end parallel_data = reshape(rf_fixed, 16, []); num_blocks = size(parallel_data, 2); %% ===================== 并行混频模块实现 ===================== fprintf('\n===== 开始并行混频处理 =====\n'); tic; % NCO参数计算 nco_phase_step = 2*pi*fc/(Fs/16); % 每路相位增量 nco_initial_phase = 2*pi*fc*(0:15)/Fs; % 16路初始相位 % 初始化混频输出 mixed_data = complex(zeros(16, num_blocks)); % 复数类型 % 并行混频处理 for block_idx = 1:num_blocks samples = parallel_data(:, block_idx); % 计算每个通道的NCO相位 time_offset = (block_idx-1)*16; % 时间偏移 current_phase = nco_initial_phase + time_offset*nco_phase_step; % 生成NCO载波 nco_carrier = exp(-1i * current_phase); % 混频处理 mixed_data(:, block_idx) = double(samples) .* nco_carrier.'; end % 重组为串行数据 mixed_serial = reshape(mixed_data, 1, []); mixer_time = toc; fprintf('并行混频处理完成! 耗时: %.4f 秒\n', mixer_time); %% ===================== 16倍并行多相抽取器 ===================== fprintf('\n===== 开始16倍并行多相抽取 =====\n'); tic; % 设计抗混叠滤波器(截止频率156.25 MHz) cutoff_freq = 0.9 * (Fs/16/2); % 140.625 MHz filter_order = 255; % FIR滤波器阶数 h = fir1(filter_order, cutoff_freq/(Fs/2), 'low', kaiser(filter_order+1, 5)); % 多相分解(16个子滤波器) num_taps = length(h); if mod(num_taps, 16) ~= 0 h = [h, zeros(1, 16 - mod(num_taps,16))]; % 补零对齐 end poly_phase = reshape(h, 16, []); % 16x(L/16) 多相系数矩阵 L_poly = size(poly_phase, 2); % 每个多相分支的抽头数 % 初始化历史缓冲区(存储前L-1个样本) hist_buffer = complex(zeros(16, L_poly-1)); % 复数缓冲区 % 处理每个数据块 decimated_output = complex(zeros(1, num_blocks)); % 抽取后输出 for block_idx = 1:num_blocks % 当前块数据 + 历史缓冲区 current_block = mixed_data(:, block_idx); full_block = [hist_buffer, current_block]; % 16xL_poly % 多相滤波(16路并行乘加) poly_out = zeros(16, 1); % 存储每路输出 for i = 1:16 poly_out(i) = sum(poly_phase(i, :) .* full_block(i, :)); end % 输出抽取结果(16:1) decimated_output(block_idx) = sum(poly_out); % 更新历史缓冲区(移除最旧数据) hist_buffer = full_block(:, 2:end); end % 计算新采样率 Fs_current = Fs / 16; % 312.5 MHz decimator_time = toc; fprintf('并行多相抽取完成! 耗时: %.4f 秒\n', decimator_time); fprintf('输出采样率: %.1f MHz\n', Fs_current/1e6); %% ===================== 多级抽取滤波器组 ===================== fprintf('\n===== 开始CIC(8x)+HB(2x)+FIR(整形)滤波器组 =====\n'); tic; % 系统参数 signal_bw = bw; % 信号带宽 5 MHz target_fs = 19.53125e6; % 目标采样率 312.5/(8*2) = 19.53125 MHz % 抽取方案: % 1. CIC抽取: 8倍 (312.5/8 = 39.0625 MHz) % 2. HB滤波器: 2倍 (39.0625/2 = 19.53125 MHz) % 3. FIR补偿滤波器: 1倍 (仅整形滤波) %% 第一阶段: CIC滤波器 (8倍抽取) fprintf('\n--- 阶段1: CIC滤波器 (8倍抽取) ---\n'); R_cic = 8; % 抽取因子8 N_cic = 5; % CIC阶数 (5阶提供高阻带抑制) M_cic = 1; % 差分延迟 % 确保输入数据长度是抽取因子的整数倍 if mod(length(decimated_output), R_cic) ~= 0 padding = R_cic - mod(length(decimated_output), R_cic); decimated_output = [decimated_output, zeros(1, padding)]; end % 创建CIC抽取器 cicDecim = dsp.CICDecimator(R_cic, N_cic, M_cic); cic_output = cicDecim(decimated_output.'); % 需要列向量 % 更新采样率 Fs_cic = Fs_current / R_cic; % 39.0625 MHz fprintf('CIC输出采样率: %.3f MHz\n', Fs_cic/1e6); %% 第二阶段: 半带滤波器 (HB, 2倍抽取) fprintf('\n--- 阶段2: 半带滤波器 (2倍抽取) ---\n'); R_hb = 2; % 抽取因子2 % 确保输入数据长度是抽取因子的整数倍 if mod(length(cic_output), R_hb) ~= 0 padding = R_hb - mod(length(cic_output), R_hb); cic_output = [cic_output; zeros(padding, 1)]; end % 设计半带滤波器 (高阻带抑制) hbSpec = fdesign.decimator(R_hb, 'halfband', 'Tw,Ast', 0.1*Fs_cic, 90, Fs_cic); hbFilt = design(hbSpec, 'equiripple', 'SystemObject', true); % 应用半带滤波器 hb_output = hbFilt(cic_output); % 更新采样率 Fs_hb = Fs_cic / R_hb; % 19.53125 MHz fprintf('HB输出采样率: %.3f MHz\n', Fs_hb/1e6); %% 第三阶段: FIR整形滤波器 (不抽取) fprintf('\n--- 阶段3: FIR整形滤波器 (无抽取) ---\n'); % 设计参数 - 优化通带平坦度和阻带抑制 Fpass = 1.1 * signal_bw; % 通带截止 5.5 MHz Fstop = 1.5 * signal_bw; % 阻带起始 7.5 MHz Apass = 0.05; % 通带纹波(0.05 dB) Astop = 90; % 阻带衰减(90 dB) % 设计补偿滤波器 firSpec = fdesign.lowpass('Fp,Fst,Ap,Ast', Fpass, Fstop, Apass, Astop, Fs_hb); firFilt = design(firSpec, 'equiripple', 'SystemObject', true); % 应用FIR滤波器 fir_output = firFilt(hb_output); % 最终输出采样率保持19.53125 MHz Fs_final = Fs_hb; fprintf('FIR输出采样率: %.3f MHz\n', Fs_final/1e6); %% 最终输出 final_output = fir_output; filter_time = toc; fprintf('多级滤波器组处理完成! 总耗时: %.4f 秒\n', filter_time); %% ===== 多级滤波器性能指标 ===== fprintf('\n===== 多级滤波器性能指标 =====\n'); % 计算资源消耗 coeffs_hb = hbFilt.Numerator; coeffs_fir = firFilt.Numerator; num_mult_hb = length(coeffs_hb(coeffs_hb ~= 0)); % 非零系数 num_mult_fir = length(coeffs_fir); fprintf('半带滤波器乘法器数量: %d\n', num_mult_hb); fprintf('FIR滤波器乘法器数量: %d\n', num_mult_fir); fprintf('总乘法操作/输出样本: %.1f\n', num_mult_hb/R_hb + num_mult_fir); % 信号质量分析 % 计算抽取因子总和 total_decimation = 16 * R_cic * R_hb; % 16(多相) * 8(CIC) * 2(HB) = 256 expected_bb_final = resample(baseband(:), 1, total_decimation); % 确保列向量 % 确保长度匹配 min_len = min(length(final_output), length(expected_bb_final)); final_output_trim = final_output(1:min_len); expected_bb_final_trim = expected_bb_final(1:min_len); % 计算误差 error_final = final_output_trim - expected_bb_final_trim; % 计算信号功率和噪声功率 signal_power = mean(abs(expected_bb_final_trim).^2); noise_power = mean(abs(error_final).^2); % 计算SNR if noise_power > 0 snr_final = 10*log10(signal_power / noise_power); else snr_final = Inf; end fprintf('最终输出信号SNR: %.2f dB\n', snr_final); % 计算EVM if signal_power > 0 evm = sqrt(noise_power) / sqrt(signal_power) * 100; else evm = Inf; end fprintf('最终输出EVM: %.2f%%\n', evm); %% ===================== 频谱分析 ===================== % 创建瀑布图 figure('Name', '多级处理频谱瀑布图', 'Position', [50, 50, 1200, 800], 'NumberTitle', 'off'); % 1. 原始信号频谱 subplot(3,2,1); N_fft = 2^nextpow2(num_samples); f_axis = (-N_fft/2:N_fft/2-1)*(Fs/N_fft); spectrum = fftshift(abs(fft(rf_fixed, N_fft))); plot(f_axis/1e9, 20*log10(spectrum/max(spectrum))); title('原始信号频谱 (5 GHz 采样率)'); xlabel('频率 (GHz)'); ylabel('幅度 (dB)'); xlim([0, 2.5]); grid on; % 2. 混频后基带信号频谱 subplot(3,2,2); N_fft_mixed = 2^nextpow2(length(mixed_serial)); f_axis_mixed = (-N_fft_mixed/2:N_fft_mixed/2-1)*(Fs/N_fft_mixed); spectrum_mixed = fftshift(abs(fft(mixed_serial, N_fft_mixed))); plot(f_axis_mixed/1e6, 20*log10(spectrum_mixed/max(spectrum_mixed))); title('混频后基带信号频谱 (5 GHz 采样率)'); xlabel('频率 (MHz)'); ylabel('幅度 (dB)'); xlim([-20, 20]); grid on; % 3. CIC输出频谱 subplot(3,2,3); N_fft_cic = 2^nextpow2(length(cic_output)); f_axis_cic = (-N_fft_cic/2:N_fft_cic/2-1)*(Fs_cic/N_fft_cic); spectrum_cic = fftshift(abs(fft(cic_output, N_fft_cic))); plot(f_axis_cic/1e6, 20*log10(spectrum_cic/max(spectrum_cic))); title(sprintf('CIC输出频谱 (%.3f MHz 采样率)', Fs_cic/1e6)); xlabel('频率 (MHz)'); ylabel('幅度 (dB)'); xlim([-20, 20]); grid on; % 4. HB输出频谱 subplot(3,2,4); N_fft_hb = 2^nextpow2(length(hb_output)); f_axis_hb = (-N_fft_hb/2:N_fft_hb/2-1)*(Fs_hb/N_fft_hb); spectrum_hb = fftshift(abs(fft(hb_output, N_fft_hb))); plot(f_axis_hb/1e6, 20*log10(spectrum_hb/max(spectrum_hb))); title(sprintf('HB输出频谱 (%.3f MHz 采样率)', Fs_hb/1e6)); xlabel('频率 (MHz)'); ylabel('幅度 (dB)'); xlim([-10, 10]); grid on; % 5. FIR输出频谱 subplot(3,2,5); N_fft_final = 2^nextpow2(length(final_output)); f_axis_final = (-N_fft_final/2:N_fft_final/2-1)*(Fs_final/N_fft_final); spectrum_final = fftshift(abs(fft(final_output, N_fft_final))); plot(f_axis_final/1e6, 20*log10(spectrum_final/max(spectrum_final))); title(sprintf('FIR输出频谱 (%.3f MHz 采样率)', Fs_final/1e6)); xlabel('频率 (MHz)'); ylabel('幅度 (dB)'); xlim([-10, 10]); grid on; line([-signal_bw/1e6, -signal_bw/1e6], ylim, 'Color', 'r', 'LineStyle', '--'); line([signal_bw/1e6, signal_bw/1e6], ylim, 'Color', 'r', 'LineStyle', '--'); legend('频谱', '信号带宽边界'); % 6. 最终信号星座图 subplot(3,2,6); % 重采样到符号率 resampled = resample(final_output, 1, round(Fs_final/symbol_rate)); scatterplot(resampled(100:end-100)); title('最终输出星座图'); grid on; %% ===================== 滤波器响应分析 ===================== figure('Name', '多级滤波器响应', 'Position', [100, 100, 1200, 600], 'NumberTitle', 'off'); % CIC响应 subplot(1,3,1); [h_cic, w_cic] = freqz(cicDecim, 1024, Fs_current); plot(w_cic/1e6, 20*log10(abs(h_cic))); title('CIC滤波器响应 (8倍抽取)'); xlabel('频率 (MHz)'); ylabel('幅度 (dB)'); grid on; xlim([0, Fs_current/2/1e6]); % HB响应 subplot(1,3,2); [h_hb, w_hb] = freqz(hbFilt, 1024, Fs_cic); plot(w_hb/1e6, 20*log10(abs(h_hb))); title('半带滤波器响应 (2倍抽取)'); xlabel('频率 (MHz)'); ylabel('幅度 (dB)'); grid on; xlim([0, Fs_cic/2/1e6]); % FIR响应 subplot(1,3,3); [h_fir, w_fir] = freqz(firFilt, 1024, Fs_hb); plot(w_fir/1e6, 20*log10(abs(h_fir))); title('FIR整形滤波器响应 (无抽取)'); xlabel('频率 (MHz)'); ylabel('幅度 (dB)'); grid on; xlim([0, Fs_hb/2/1e6]); %% ===================== 时域波形分析 ===================== figure('Name', '时域波形分析', 'Position', [150, 150, 1200, 800], 'NumberTitle', 'off'); % 选择分析时间段 start_idx = 1000; end_idx = min([1200, length(baseband), length(mixed_serial), length(decimated_output), ... length(cic_output)*8, length(hb_output)*16, length(final_output)*16]); % 原始基带信号 subplot(4,1,1); plot(real(baseband(start_idx:end_idx))); hold on; plot(imag(baseband(start_idx:end_idx))); title('原始基带信号 (I/Q)'); xlabel('样本索引'); ylabel('幅度'); legend('I路', 'Q路'); grid on; % 混频后信号 subplot(4,1,2); plot(real(mixed_serial(start_idx:end_idx))); hold on; plot(imag(mixed_serial(start_idx:end_idx))); title('混频后基带信号 (I/Q)'); xlabel('样本索引'); ylabel('幅度'); legend('I路', 'Q路'); grid on; % CIC输出信号 subplot(4,1,3); cic_idx = ceil(start_idx/8):min(ceil(end_idx/8), length(cic_output)); plot(real(cic_output(cic_idx))); hold on; plot(imag(cic_output(cic_idx))); title('CIC输出信号 (I/Q)'); xlabel('样本索引 (降采样后)'); ylabel('幅度'); legend('I路', 'Q路'); grid on; % 最终输出信号 subplot(4,1,4); final_idx = ceil(start_idx/16):min(ceil(end_idx/16), length(final_output)); plot(real(final_output(final_idx))); hold on; plot(imag(final_output(final_idx))); title('最终输出信号 (I/Q)'); xlabel('样本索引 (降采样后)'); ylabel('幅度'); legend('I路', 'Q路'); grid on; %% 保存结果 save('ddc_cic8_hb2_fir_results.mat', 'mixed_serial', 'decimated_output', 'final_output', ... 'Fs_current', 'Fs_final', 'snr_final', 'evm'); fprintf('\n处理完成! 结果已保存。\n'); 这段代码修改频谱图绘制部分,分页绘制,混频后,多相滤波后,CIC,HB,FIR后的频谱图,以及各个滤波器的频谱响应图,计算性能指标

%% 参数设置 clear all; close all; clc; Fs = 5e9; % 采样率 5 GHz fc = 1e9; % 载波频率 1 GHz bw = 5e6; % 信号带宽 5 MHz duration = 20e-6; % 信号持续时间 20 μs t = 0:1/Fs:duration-1/Fs; %% 生成QPSK调制信号 fprintf('生成QPSK调制信号...\n'); symbol_rate = bw/2; % 符号率 2.5 MHz sps = floor(Fs/symbol_rate); % 每符号采样点数 num_symbols = ceil(length(t)/sps); data = randi([0 3], 1, num_symbols); % QPSK数据 modulated = pskmod(data, 4, pi/4); % QPSK调制 % 升余弦滤波 rolloff = 0.35; filt = rcosdesign(rolloff, 6, sps); baseband = upfirdn(modulated, filt, sps, 1); baseband = baseband(1:length(t)); %% 上变频 fprintf('上变频到RF...\n'); carrier = exp(1i*2*pi*fc*t); rf_signal = real(baseband .* carrier); %% 添加噪声 fprintf('添加噪声...\n'); noise_power = 0.01 * var(rf_signal); rf_signal = rf_signal + sqrt(noise_power)*randn(size(rf_signal)); %% 定点量化 (16位有符号) fprintf('定点量化...\n'); nbits = 16; max_val = 2^(nbits-1)-1; rf_signal_normalized = rf_signal / max(abs(rf_signal)); rf_fixed = round(rf_signal_normalized * max_val); rf_fixed(rf_fixed > max_val) = max_val; rf_fixed(rf_fixed < -max_val) = -max_val; %% 重组为16路并行数据 fprintf('重组为16路并行数据...\n'); num_samples = length(rf_fixed); if mod(num_samples, 16) ~= 0 rf_fixed = [rf_fixed, zeros(1, 16 - mod(num_samples, 16))]; num_samples = length(rf_fixed); end parallel_data = reshape(rf_fixed, 16, []); num_blocks = size(parallel_data, 2); %% ===================== 并行混频模块实现 ===================== fprintf('\n===== 开始并行混频处理 =====\n'); tic; % NCO参数计算 nco_phase_step = 2*pi*fc/(Fs/16); % 每路相位增量 nco_initial_phase = 2*pi*fc*(0:15)/Fs; % 16路初始相位 % 初始化混频输出 mixed_data = zeros(16, num_blocks); % 并行混频处理 for block_idx = 1:num_blocks samples = parallel_data(:, block_idx); % 计算每个通道的NCO相位 time_offset = (block_idx-1)*16; % 时间偏移 current_phase = nco_initial_phase + time_offset*nco_phase_step; % 生成NCO载波 nco_carrier = exp(-1i * current_phase); % 混频处理 mixed_data(:, block_idx) = double(samples) .* nco_carrier.'; end % 重组为串行数据 mixed_serial = reshape(mixed_data, 1, []); mixer_time = toc; fprintf('并行混频处理完成! 耗时: %.4f 秒\n', mixer_time); %% ===================== CIC滤波器实现 (5级, 16倍抽取) ===================== fprintf('\n===== 开始CIC滤波处理 =====\n'); tic; % CIC参数设置 R = 16; % 抽取因子 N = 5; % 滤波器级数 M = 1; % 差分延迟 % 创建CIC抽取器 cicDecim = dsp.CICDecimator(R, M, N, ... 'FixedPointDataType', 'Full precision'); % 分离I/Q路 I_in = real(mixed_serial); Q_in = imag(mixed_serial); % 应用CIC滤波器 I_cic = cicDecim(I_in'); Q_cic = cicDecim(Q_in'); % 手动截位到14位 (符合设计说明) I_cic = int16(I_cic * 2^2); % 保留14位精度 Q_cic = int16(Q_cic * 2^2); % 保留14位精度 % 组合为复数信号 cic_output = complex(double(I_cic)/4, double(Q_cic)/4); % 缩放回原始范围 cic_time = toc; fprintf('CIC滤波处理完成! 耗时: %.4f 秒\n', cic_time); fprintf('CIC抽取率: %d, 输出采样率: %.2f MHz\n', R, (Fs/R)/1e6); %% ===================== 半带滤波器实现 (2倍抽取) ===================== fprintf('\n===== 开始半带滤波处理 =====\n'); tic; % 半带滤波器系数 (根据设计说明中的量化系数) % 原始系数乘以2^16量化,这里除以2^16还原 hb_coeff_int = [... -102, -4745, -1238, -624, 5131, 688, -1259, 20073, 1238, ... -1175, 27316, 47, 47, 20073, -1175, 1238, 5131, -1259, ... 688, -4745, -624, -1238, -4245, -102, -1747, 965, 0, ... 667, 3020, 0, 3020, 667, 965]; hb_coeff = double(hb_coeff_int) / 2^16; % 创建半带抽取器 (修复数据类型问题) % 使用正确的numerictype设置 hb_nt = numerictype(1, 14, 0); % 14位有符号整数 hbDecim = dsp.FIRDecimator(2, hb_coeff, ... 'FullPrecisionOverride', false, ... 'OutputDataType', 'Custom', ... 'CustomOutputDataType', hb_nt); % 应用半带滤波器 I_hb = hbDecim(double(I_cic)); % 转换为double输入 Q_hb = hbDecim(double(Q_cic)); % 转换为double输入 % 组合为复数信号 hb_output = complex(I_hb, Q_hb); hb_time = toc; fprintf('半带滤波处理完成! 耗时: %.4f 秒\n', hb_time); fprintf('HB抽取率: 2, 输出采样率: %.2f MHz\n', (Fs/R/2)/1e6); %% ===================== FIR滤波器实现 ===================== fprintf('\n===== 开始FIR滤波处理 =====\n'); tic; % FIR滤波器参数 Fs_fir = Fs / (R * 2); % 当前采样率 = 5e9 / (16*2) = 156.25 MHz Fpass = 2.5e6; % 通带频率 2.5 MHz Fstop = 3.5e6; % 阻带频率 3.5 MHz Apass = 1; % 通带波纹 1 dB Astop = 60; % 阻带衰减 60 dB % 设计FIR滤波器 firFilt = designfilt('lowpassfir', ... 'PassbandFrequency', Fpass/(Fs_fir/2), ... % 归一化频率 'StopbandFrequency', Fstop/(Fs_fir/2), ... % 归一化频率 'PassbandRipple', Apass, ... 'StopbandAttenuation', Astop, ... 'DesignMethod', 'equiripple'); % 应用FIR滤波器 I_fir = filter(firFilt, double(I_hb)); Q_fir = filter(firFilt, double(Q_hb)); % 组合为复数信号 fir_output = complex(I_fir, Q_fir); fir_time = toc; fprintf('FIR滤波处理完成! 耗时: %.4f 秒\n', fir_time); %% ===================== 性能指标计算 ===================== fprintf('\n===== 性能指标 =====\n'); % 计算总处理时间 total_time = mixer_time + cic_time + hb_time + fir_time; fprintf('总处理时间: %.4f 秒\n', total_time); % 计算信号质量 % 原始基带信号降采样到最终采样率 decimation_factor = sps; % 总抽取因子 = 原始sps expected_bb = decimate(baseband, decimation_factor); % 调整长度匹配 min_len = min(length(fir_output), length(expected_bb)); fir_output_adj = fir_output(1:min_len); expected_bb_adj = expected_bb(1:min_len); error = fir_output_adj - expected_bb_adj; snr = 10*log10(mean(abs(expected_bb_adj).^2) / mean(abs(error).^2)); evm = sqrt(mean(abs(error).^2) / mean(abs(expected_bb_adj).^2)) * 100; fprintf('输出信噪比(SNR): %.2f dB\n', snr); fprintf('误差向量幅度(EVM): %.2f%%\n', evm); %% ===================== 频谱分析 ===================== % 1. 原始信号频谱 figure('Name', '原始信号频谱', 'Position', [50, 50, 800, 400], 'NumberTitle', 'off'); N_fft = 2^nextpow2(num_samples); f_axis = (-N_fft/2:N_fft/2-1)*(Fs/N_fft); spectrum = fftshift(abs(fft(rf_fixed, N_fft))); plot(f_axis/1e9, 20*log10(spectrum/max(spectrum))); title('原始信号频谱 (5 GHz 采样率)'); xlabel('频率 (GHz)'); ylabel('幅度 (dB)'); xlim([0, 2.5]); grid on; % 2. 混频后基带信号频谱 figure('Name', '混频后基带信号频谱', 'Position', [100, 100, 800, 400], 'NumberTitle', 'off'); N_fft_mixed = 2^nextpow2(length(mixed_serial)); f_axis_mixed = (-N_fft_mixed/2:N_fft_mixed/2-1)*(Fs/N_fft_mixed); spectrum_mixed = fftshift(abs(fft(mixed_serial, N_fft_mixed))); plot(f_axis_mixed/1e6, 20*log10(spectrum_mixed/max(spectrum_mixed))); title('混频后基带信号频谱 (312.5 MHz 采样率)'); xlabel('频率 (MHz)'); ylabel('幅度 (dB)'); xlim([-20, 20]); grid on; % 3. CIC输出频谱 figure('Name', 'CIC输出频谱', 'Position', [150, 150, 800, 400], 'NumberTitle', 'off'); Fs_cic = Fs / R; N_fft_cic = 2^nextpow2(length(cic_output)); f_axis_cic = (-N_fft_cic/2:N_fft_cic/2-1)*(Fs_cic/N_fft_cic); spectrum_cic = fftshift(abs(fft(cic_output, N_fft_cic))); plot(f_axis_cic/1e6, 20*log10(spectrum_cic/max(spectrum_cic))); title(sprintf('CIC输出频谱 (%.2f MHz 采样率)', Fs_cic/1e6)); xlabel('频率 (MHz)'); ylabel('幅度 (dB)'); xlim([-10, 10]); grid on; % 4. HB输出频谱 figure('Name', 'HB输出频谱', 'Position', [200, 200, 800, 400], 'NumberTitle', 'off'); Fs_hb = Fs_cic / 2; N_fft_hb = 2^nextpow2(length(hb_output)); f_axis_hb = (-N_fft_hb/2:N_fft_hb/2-1)*(Fs_hb/N_fft_hb); spectrum_hb = fftshift(abs(fft(hb_output, N_fft_hb))); plot(f_axis_hb/1e6, 20*log10(spectrum_hb/max(spectrum_hb))); title(sprintf('HB输出频谱 (%.2f MHz 采样率)', Fs_hb/1e6)); xlabel('频率 (MHz)'); ylabel('幅度 (dB)'); xlim([-5, 5]); grid on; % 5. FIR输出频谱 figure('Name', 'FIR输出频谱', 'Position', [250, 250, 800, 400], 'NumberTitle', 'off'); N_fft_fir = 2^nextpow2(length(fir_output)); f_axis_fir = (-N_fft_fir/2:N_fft_fir/2-1)*(Fs_fir/N_fft_fir); spectrum_fir = fftshift(abs(fft(fir_output, N_fft_fir))); plot(f_axis_fir/1e6, 20*log10(spectrum_fir/max(spectrum_fir))); title(sprintf('FIR输出频谱 (%.2f MHz 采样率)', Fs_fir/1e6)); xlabel('频率 (MHz)'); ylabel('幅度 (dB)'); xlim([-3, 3]); grid on; % 6. 最终输出信号对比 figure('Name', '最终输出信号对比', 'Position', [300, 300, 1000, 600], 'NumberTitle', 'off'); subplot(2,1,1); plot(real(expected_bb_adj(1:200))), hold on; plot(real(fir_output_adj(1:200))); title('基带信号实部对比'); xlabel('样本索引'); ylabel('幅度'); legend('原始基带', 'DDC输出'); grid on; subplot(2,1,2); plot(imag(expected_bb_adj(1:200))), hold on; plot(imag(fir_output_adj(1:200))); title('基带信号虚部对比'); xlabel('样本索引'); ylabel('幅度'); legend('原始基带', 'DDC输出'); grid on; %% ===================== 资源消耗分析 ===================== fprintf('\n===== 资源消耗分析 =====\n'); % CIC资源估算 cic_multipliers = 0; % CIC不使用乘法器 cic_adders = 5 * 2; % 5级,每级1个积分器1个梳状器 cic_memory = 5 * 16 * 40/8; % 5级,每级16个延迟单元,40位宽度 fprintf('CIC滤波器资源:\n'); fprintf(' - 乘法器: %d\n', cic_multipliers); fprintf(' - 加法器: %d\n', cic_adders); fprintf(' - 内存使用: %d bytes\n', cic_memory); % HB资源估算 (复用结构) hb_multipliers = 1; % 复用结构使用1个乘法器 hb_adders = 8; % 加法器数量 hb_memory = 17 * 16/8; % 17个系数存储 fprintf('\n半带滤波器资源 (复用结构):\n'); fprintf(' - 乘法器: %d\n', hb_multipliers); fprintf(' - 加法器: %d\n', hb_adders); fprintf(' - 内存使用: %d bytes\n', hb_memory); % FIR资源估算 fir_order = length(firFilt.Coefficients) - 1; fir_multipliers = fir_order + 1; fir_adders = fir_order; fir_memory = (fir_order + 1) * 16/8; % 系数存储 fprintf('\nFIR滤波器资源:\n'); fprintf(' - 乘法器: %d\n', fir_multipliers); fprintf(' - 加法器: %d\n', fir_adders); fprintf(' - 内存使用: %d bytes\n', fir_memory); % 总计 total_multipliers = cic_multipliers + hb_multipliers + fir_multipliers; total_adders = cic_adders + hb_adders + fir_adders; total_memory = cic_memory + hb_memory + fir_memory; fprintf('\n总计资源消耗:\n'); fprintf(' - 总乘法器: %d\n', total_multipliers); fprintf(' - 总加法器: %d\n', total_adders); fprintf(' - 总内存: %d bytes\n', total_memory); %% 保存结果 save('full_ddc_results.mat', 'mixed_serial', 'cic_output', 'hb_output', 'fir_output', ... 'mixer_time', 'cic_time', 'hb_time', 'fir_time', 'snr', 'evm'); fprintf('\n处理完成! 结果已保存。\n');修改这段代码中错误使用 dsp.FIRDecimator/parseInputArguments CustomOutputDataType 属性值必须为 signedness 设置为 'Auto' 的数值类型。 出错 dsp.FIRDecimator 出错 untitledcic1 (第 133 行) hbDecim = dsp.FIRDecimator(2, hb_coeff, ...

%% ================ 雷达系统参数设置 ================ % 基本参数 pd = 0.9; % 检测概率 pfa = 1e-6; % 虚警概率 max_range = 20000; % 最大探测距离 (m) tgt_rcs = 1.5; % 目标RCS (m²) int_pulsenum = 10; % 积累脉冲数 B=7.5e6; fs = B; % 采样率 (Hz) prf = 7500; % 脉冲重复频率 (Hz) pulse_width = 10e-6; % 脉冲宽度 (s) fc = 10e9; % 载波频率 (Hz) v = physconst(‘LightSpeed’); % 传播速度 (m/s) lambda = v/fc; % 波长 (m) %% ================ 系统组件初始化 ================ % 1. 波形发生器 load BasicMonostaticRadarExampleData; waveform = phased.LinearFMWaveform(… ‘SampleRate’, fs,… ‘PRF’, prf,… ‘PulseWidth’, pulse_width,… ‘SweepBandwidth’, B,… ‘SweepDirection’, ‘Up’,… ‘SweepInterval’, ‘Positive’); % 2. 天线阵列 antenna = phased.IsotropicAntennaElement(… ‘FrequencyRange’, [0.8fc 1.2fc],… ‘BackBaffled’, true); ura = phased.URA(… ‘Element’, antenna,… ‘Size’, [25 25],… ‘ElementSpacing’, [lambda/2 lambda/2]); % 3. 发射机 array_gain_db = 10log10(2525); % 阵列增益 snr_min = albersheim(pd, pfa, int_pulsenum); noise_power = noisepow(1/waveform.PulseWidth); % 噪声系数3dB, 290K参考温度 peak_power = ((4pi)^3 * noise_power * max_range^4 * db2pow(snr_min)) / … (db2pow(2(array_gain_db+20)) * tgt_rcs * lambda^2); transmitter = phased.Transmitter(… ‘PeakPower’, peak_power/625,… ‘Gain’, 20,… ‘LossFactor’, 0,… ‘InUseOutputPort’, true,… ‘CoherentOnTransmit’, true); % 4. 接收机 receiver = phased.ReceiverPreamp(… ‘SampleRate’, fs,… ‘Gain’, 20,… ‘NoiseFigure’, 0,… ‘ReferenceTemperature’, 290,… ‘EnableInputPort’, true,… ‘SeedSource’, ‘Property’,… ‘Seed’, 2023); % 5. 辐射器和收集器 radiator = phased.Radiator(… ‘Sensor’, ura,… ‘OperatingFrequency’, fc,… ‘PropagationSpeed’, v,… ‘CombineRadiatedSignals’, true,… ‘WeightsInputPort’, true); collector = phased.Collector(… ‘Sensor’, ura,… ‘OperatingFrequency’, fc,… ‘PropagationSpeed’, v,… ‘Wavefront’, ‘Plane’); %% ================ 目标模型参数设置 ================ tgtpos = [[13500cosd(2);13500sind(2); 0],[13530cosd(2);13530sind(2); 0],[13470cosd(2);13470sind(2); 0],[18000cosd(2); 18000sind(2); 0],[18030cosd(2); 18030sind(2); 0],[179700cosd(2); 17970sind(2); 0]]; tgtvel = [[-450cosd(2);-450sind(2); 0],[-450cosd(2); -450sind(2); 0],[-450cosd(2);-450sind(2); 0],[-450cosd(6);-450sind(6); 0],[-450cosd(6);-450sind(6); 0],[-450cosd(6);-450sind(6); 0]]; tgtmotion = phased.Platform(‘InitialPosition’,tgtpos,‘Velocity’,tgtvel); tgtrcs = [1.5 1.5 1.5 1.5 1.5 1.5]; target = phased.RadarTarget(‘MeanRCS’,tgtrcs,‘OperatingFrequency’,fc); % Calculate the range, angle, and speed of the targets [tgtrng,tgtang] = rangeangle(tgtmotion.InitialPosition,… sensormotion.InitialPosition); numtargets = length(target.MeanRCS); %% ================ 目标模型初始化 ================ tgtmotion = phased.Platform(‘InitialPosition’, tgtpos, ‘Velocity’, tgtvel); target = phased.RadarTarget(‘MeanRCS’, tgtrcs, ‘OperatingFrequency’, fc); % 7. 传播信道 channel = phased.FreeSpace(… ‘SampleRate’, fs,… ‘TwoWayPropagation’, true,… ‘OperatingFrequency’, fc); % 8. 波束形成组件 steeringvec = phased.SteeringVector(… ‘SensorArray’, ura,… ‘PropagationSpeed’, v); beamformer = phased.PhaseShiftBeamformer(… ‘SensorArray’, ura,… ‘OperatingFrequency’, fc,… ‘PropagationSpeed’, v,… ‘DirectionSource’, ‘Input port’); % 9. 雷达平台 sensormotion = phased.Platform(… ‘InitialPosition’, [0; 0; 0],… ‘Velocity’, [0; 0; 0]); %% ================ 扫描参数设置 ================ initialAz = 60; % 起始方位角 (度) endAz = -60; % 结束方位角 (度) scanstep = -4; % 扫描步长 (度) 负值表示从右向左扫描 % 确保扫描范围正确 if initialAz < endAz % 如果起始角度小于结束角度,交换值 [initialAz, endAz] = deal(endAz, initialAz); scanstep = -scanstep; % 反转扫描方向 end % 计算扫描网格 scangrid = initialAz-2 : scanstep : endAz+2; numscans = length(scangrid); disp(['扫描角度范围: ', num2str(scangrid(1)), '° 到 ', num2str(scangrid(end)), ‘°’]); disp(['扫描步数: ', num2str(numscans), ’ (步长: ', num2str(scanstep), ‘°)’]); disp(['每个波位脉冲数: ', num2str(int_pulsenum)]); pulsenum = int_pulsenum * numscans; % 总脉冲数 revisitTime = pulsenum / prf; % 扫描周期 % 计算每个PRI的采样点数 pri = 1 / prf; % 脉冲重复间隔 samples_per_pri = round(pri * fs); % 3000 (22.5e6 / 7500) fast_time_grid = (0:samples_per_pri-1)/fs; % 快时间网格 % 预分配接收信号矩阵 rxpulses = zeros(samples_per_pri, pulsenum); % 计算目标的距离、角度和速度 [tgtrng,tgtang] = rangeangle(tgtmotion.InitialPosition,… sensormotion.InitialPosition); numtargets = length(target.MeanRCS); % 创建导向矢量和波束形成器 steeringvec = phased.SteeringVector(‘SensorArray’,ura,… ‘PropagationSpeed’,v); % 计算不同方向上的相位偏移权重 % 创建接收端的波束形成器 beamformer = phased.PhaseShiftBeamformer(‘SensorArray’,ura,… ‘OperatingFrequency’,fc,‘PropagationSpeed’,v,… ‘DirectionSource’,‘Input port’); % 输入端口指定方向 % 定义传播信道 channel = phased.FreeSpace(… ‘SampleRate’,fs,… ‘TwoWayPropagation’,true,… ‘OperatingFrequency’,fc); % 创建快时间网格(从0开始,步长1/fs,上限1/prf) fast_time_grid = unigrid(0, 1/fs, 1/prf, ‘[)’); % 预分配接收信号矩阵 rxpulses = zeros(numel(fast_time_grid),pulsenum); % 预分配内存存储接收到的脉冲信号 % 创建阻塞式干扰机(有效辐射功率6000W,采样帧数=波形脉冲数×采样率/PRF) jammer = barrageJammer(‘ERP’,6000,… ‘SamplesPerFrame’,waveform.NumPulses*waveform.SampleRate/waveform.PRF); % 创建干扰信号传播信道(单向传播) jammerchannel = phased.FreeSpace(‘TwoWayPropagation’,false,… ‘SampleRate’,fs,‘OperatingFrequency’, fc); % 干扰机位置坐标 jammerloc = [15000; 15000; 30]; % 计算干扰机相对于雷达的角度 [~,jamang] = rangeangle(jammerloc); % 主处理循环 - 处理每个脉冲 for m = 1:pulsenum % 更新平台和目标位置 [sensorpos,sensorvel] = sensormotion(1/prf); % 调用运动模型函数更新雷达平台位置/速度 [tgtpos,tgtvel] = tgtmotion(1/prf); % 更新时间步长 = 1/PRF(脉冲重复间隔) % 计算目标相对参数 [tgtrng,tgtang] = rangeangle(tgtpos,sensorpos); % 计算目标相对雷达的距离角度[方位角; 俯仰角] % 计算当前扫描角度和波束权重 scanid = floor((m-1)/int_pulsenum) + 1; % 确定当前扫描角度索引 sv = steeringvec(fc,scangrid(scanid)); % 获取当前方向的导向矢量 w = conj(sv); % 计算共轭权重(用于发射波束形成) % 生成和发射脉冲 pulse = waveform(); % 生成线性调频脉冲 [txsig,txstatus] = transmitter(pulse); % 通过发射机放大信号 txsig = radiator(txsig,tgtang,w); % 通过辐射器形成波束 txsig = channel(txsig,sensorpos,tgtpos,sensorvel,tgtvel); % 信号传播到目标 % 信号传播和目标反射 tgtsig = target(txsig); % 目标反射信号 % 生成干扰信号 jamsig = jammer(); % 生成阻塞式干扰 % 传播干扰信号到阵列 jamsig = jammerchannel(jamsig,jammerloc,[0;0;0],[0;0;0],[0;0;0]); % 收集干扰信号 jamsig = collector(jamsig,jamang); % 通过阵列收集干扰信号 % 接收和处理回波信号 rxsig = collector(tgtsig,tgtang); % 收集目标回波信号 rxsig = receiver(rxsig,~(txstatus>0)); % 通过接收机放大信号(发射时关闭接收) % 波束形成处理(接收方向与发射方向相同) rxpulses(:,m) = 625*beamformer(rxsig+jamsig,[scangrid(scanid);0]); end %% ================ 匹配滤波 ================ % 匹配滤波处理 matchingcoeff = getMatchedFilter(waveform); % 获取匹配滤波器系数 matchedfilter = phased.MatchedFilter(… ‘Coefficients’,matchingcoeff,… ‘GainOutputPort’,true); % 创建匹配滤波器对象(输出处理增益) [mf_pulses, mfgain] = matchedfilter(rxpulses); % 应用匹配滤波 % 重塑脉冲矩阵为[距离门×积累脉冲数×扫描角度] mf_pulses = reshape(mf_pulses,[],int_pulsenum,numscans); % 补偿匹配滤波引入的延迟 matchingdelay = size(matchingcoeff,1)-1; % 计算延迟量 sz_mfpulses = size(mf_pulses); % 保存原始尺寸 % 补偿延迟:移除前matchingdelay个样本,末尾补零 mf_pulses = [mf_pulses(matchingdelay+1:end) zeros(1,matchingdelay)]; mf_pulses = reshape(mf_pulses,sz_mfpulses); % 恢复原始维度 % 脉冲积累(非相干积累) int_pulses = pulsint(mf_pulses,‘noncoherent’); % 沿脉冲维度积累 int_pulses = squeeze(int_pulses); % 移除单一维度 %% ================ 检测与距离估计 ================ % 定义距离门 range_gates = v*fast_time_grid/2; % 距离门对应实际距离 % 创建时间可变增益(TVG)补偿距离衰减 tvg = phased.TimeVaryingGain(… ‘RangeLoss’,2fspl(range_gates,lambda),… % 双程自由空间路径损失 ‘ReferenceLoss’,2fspl(max(range_gates),lambda)); % 参考距离处的损失 tvg_pulses = tvg(mf_pulses); % 应用TVG % 脉冲积累(非相干) int_pulses = pulsint(tvg_pulses,‘noncoherent’); % 沿脉冲维度积累 int_pulses = squeeze(int_pulses); % 移除单一维度 % 计算检测阈值 % 在设计系统中,采样率是噪声带宽的两倍 noise_bw = receiver.SampleRate/2; % 计算噪声带宽 % 计算噪声功率(考虑接收机噪声系数和参考温度) npower = noisepow(noise_bw,… receiver.NoiseFigure,receiver.ReferenceTemperature); % 计算基于虚警概率的检测阈值 threshold = npower * db2pow(npwgnthresh(pfa,int_pulsenum,‘noncoherent’)); % 增加匹配滤波处理增益和阵列增益 threshold = threshold * db2pow(mfgain)*625; 在该代码的基础上,编写反干扰代码,使其能正确检测到目标

%% 参数设置 clear all; close all; clc; Fs = 5e9; % 采样率 5 GHz fc = 1e9; % 载波频率 1 GHz bw = 5e6; % 信号带宽 5 MHz duration = 20e-6; % 信号持续时间 20 μs t = 0:1/Fs:duration-1/Fs; %% 生成QPSK调制信号 fprintf('生成QPSK调制信号...\n'); symbol_rate = bw/2; % 符号率 2.5 MHz sps = floor(Fs/symbol_rate); % 每符号采样点数 num_symbols = ceil(length(t)/sps); data = randi([0 3], 1, num_symbols); % QPSK数据 modulated = pskmod(data, 4, pi/4); % QPSK调制 % 升余弦滤波 rolloff = 0.35; filt = rcosdesign(rolloff, 6, sps); baseband = upfirdn(modulated, filt, sps, 1); baseband = baseband(1:length(t)); %% 上变频 fprintf('上变频到RF...\n'); carrier = exp(1i*2*pi*fc*t); rf_signal = real(baseband .* carrier); %% 添加噪声 fprintf('添加噪声...\n'); noise_power = 0.01 * var(rf_signal); rf_signal = rf_signal + sqrt(noise_power)*randn(size(rf_signal)); %% 定点量化 (16位有符号) fprintf('定点量化...\n'); nbits = 16; max_val = 2^(nbits-1)-1; rf_signal_normalized = rf_signal / max(abs(rf_signal)); rf_fixed = round(rf_signal_normalized * max_val); rf_fixed(rf_fixed > max_val) = max_val; rf_fixed(rf_fixed < -max_val) = -max_val; %% 重组为16路并行数据 fprintf('重组为16路并行数据...\n'); num_samples = length(rf_fixed); if mod(num_samples, 16) ~= 0 rf_fixed = [rf_fixed, zeros(1, 16 - mod(num_samples, 16))]; num_samples = length(rf_fixed); end parallel_data = reshape(rf_fixed, 16, []); num_blocks = size(parallel_data, 2); %% ===================== 并行混频模块实现 ===================== fprintf('\n===== 开始并行混频处理 =====\n'); tic; % NCO参数计算 nco_phase_step = 2*pi*fc/(Fs/16); % 每路相位增量 nco_initial_phase = 2*pi*fc*(0:15)/Fs; % 16路初始相位 % 初始化混频输出 mixed_data = complex(zeros(16, num_blocks)); % 复数类型 % 并行混频处理 for block_idx = 1:num_blocks samples = parallel_data(:, block_idx); % 计算每个通道的NCO相位 time_offset = (block_idx-1)*16; % 时间偏移 current_phase = nco_initial_phase + time_offset*nco_phase_step; % 生成NCO载波 nco_carrier = exp(-1i * current_phase); % 混频处理 mixed_data(:, block_idx) = double(samples) .* nco_carrier.'; end % 重组为串行数据 mixed_serial = reshape(mixed_data, 1, []); mixer_time = toc; fprintf('并行混频处理完成! 耗时: %.4f 秒\n', mixer_time); %% ===================== 混频模块性能指标 ===================== fprintf('\n===== 混频模块性能指标 =====\n'); % 计算资源消耗 num_multipliers = 16; % 并行混频器数量 total_mult_ops = num_blocks * 16; % 总乘法操作数 fprintf('并行混频器数量: %d\n', num_multipliers); fprintf('每时钟周期乘法操作: %d\n', num_multipliers); fprintf('总乘法操作数: %d\n', total_mult_ops); fprintf('处理速率: %.2f MSPS\n', length(mixed_serial)/mixer_time/1e6); % 计算信号质量 expected_bb = baseband(1:length(mixed_serial)); % 期望的基带信号 error = mixed_serial - expected_bb; snr = 10*log10(mean(abs(expected_bb).^2) / mean(abs(error).^2)); fprintf('混频后信号SNR: %.2f dB\n', snr); %% ===================== 16倍并行多相抽取器 ===================== fprintf('\n===== 开始16倍并行多相抽取 =====\n'); tic; % 设计抗混叠滤波器(截止频率156.25 MHz) cutoff_freq = 0.9 * (Fs/16/2); % 140.625 MHz (留裕量) filter_order = 255; % FIR滤波器阶数 h = fir1(filter_order, cutoff_freq/(Fs/2)); % 多相分解(16个子滤波器) num_taps = length(h); if mod(num_taps, 16) ~= 0 h = [h, zeros(1, 16 - mod(num_taps,16))]; % 补零对齐 end poly_phase = reshape(h, 16, []); % 16x(L/16) 多相系数矩阵 L_poly = size(poly_phase, 2); % 每个多相分支的抽头数 % 初始化历史缓冲区(存储前L-1个样本) hist_buffer = complex(zeros(16, L_poly-1)); % 复数缓冲区 % 处理每个数据块 decimated_output = complex(zeros(1, num_blocks)); % 抽取后输出 for block_idx = 1:num_blocks % 当前块数据 + 历史缓冲区 current_block = mixed_data(:, block_idx); full_block = [hist_buffer, current_block]; % 16xL_poly % 多相滤波(16路并行乘加) poly_out = zeros(16, 1); % 存储每路输出 for i = 1:16 poly_out(i) = sum(poly_phase(i, :) .* full_block(i, :)); end % 输出抽取结果(16:1) decimated_output(block_idx) = sum(poly_out); % 更新历史缓冲区(移除最旧数据) hist_buffer = full_block(:, 2:end); end % 计算新采样率 Fs_new = Fs / 16; % 312.5 MHz decimator_time = toc; fprintf('并行多相抽取完成! 耗时: %.4f 秒\n', decimator_time); fprintf('输出采样率: %.1f MHz\n', Fs_new/1e6); %% ===== 多相抽取器性能指标 ===== fprintf('\n===== 多相抽取器性能指标 =====\n'); % 资源消耗 num_mult_blocks = 16 * L_poly; % 每块乘法器数量 total_mult_ops_dec = num_blocks * num_mult_blocks; fprintf('每块乘法操作: %d\n', num_mult_blocks); fprintf('总乘法操作数: %d\n', total_mult_ops_dec); fprintf('处理速率: %.2f MSPS\n', length(decimated_output)/decimator_time/1e6); % 信号质量分析 expected_bb_dec = resample(baseband, 1, 16, 1024); % 理想抽取结果 min_len = min(length(decimated_output), length(expected_bb_dec)); error_dec = decimated_output(1:min_len) - expected_bb_dec(1:min_len); snr_dec = 10*log10(mean(abs(expected_bb_dec(1:min_len)).^2) / mean(abs(error_dec).^2)); fprintf('抽取后信号SNR: %.2f dB\n', snr_dec); %% ===================== 频谱分析 ===================== % 1. 原始信号频谱 figure('Name', '原始信号频谱', 'Position', [50, 50, 800, 400], 'NumberTitle', 'off'); N_fft = 2^nextpow2(num_samples); f_axis = (-N_fft/2:N_fft/2-1)*(Fs/N_fft); spectrum = fftshift(abs(fft(rf_fixed, N_fft))); plot(f_axis/1e9, 20*log10(spectrum/max(spectrum))); title('原始信号频谱 (5 GHz 采样率)'); xlabel('频率 (GHz)'); ylabel('幅度 (dB)'); xlim([0, 2.5]); grid on; % 2. 混频后基带信号频谱 figure('Name', '混频后基带信号频谱', 'Position', [100, 100, 800, 400], 'NumberTitle', 'off'); N_fft_mixed = 2^nextpow2(length(mixed_serial)); f_axis_mixed = (-N_fft_mixed/2:N_fft_mixed/2-1)*(Fs/N_fft_mixed); spectrum_mixed = fftshift(abs(fft(mixed_serial, N_fft_mixed))); plot(f_axis_mixed/1e6, 20*log10(spectrum_mixed/max(spectrum_mixed))); title('混频后基带信号频谱 (5 GHz 采样率)'); xlabel('频率 (MHz)'); ylabel('幅度 (dB)'); xlim([-20, 20]); grid on; % 3. 抽取后基带信号频谱 figure('Name', '抽取后基带信号频谱', 'Position', [200, 200, 800, 400], 'NumberTitle', 'off'); N_fft_dec = 2^nextpow2(length(decimated_output)); f_axis_dec = (-N_fft_dec/2:N_fft_dec/2-1)*(Fs_new/N_fft_dec); spectrum_dec = fftshift(abs(fft(decimated_output, N_fft_dec))); plot(f_axis_dec/1e6, 20*log10(spectrum_dec/max(spectrum_dec))); title(sprintf('抽取后基带信号频谱 (%.1f MHz 采样率)', Fs_new/1e6)); xlabel('频率 (MHz)'); ylabel('幅度 (dB)'); xlim([-10, 10]); grid on; % 4. 混频前后时域对比 figure('Name', '混频前后信号对比', 'Position', [150, 150, 1000, 600], 'NumberTitle', 'off'); subplot(2,1,1); plot(real(baseband(1:200))), hold on; plot(real(mixed_serial(1:200))); title('混频前后信号实部对比'); xlabel('样本索引'); ylabel('幅度'); legend('原始基带', '混频输出'); grid on; subplot(2,1,2); plot(imag(baseband(1:200))), hold on; plot(imag(mixed_serial(1:200))); title('混频前后信号虚部对比'); xlabel('样本索引'); ylabel('幅度'); legend('原始基带', '混频输出'); grid on; % 5. 抽取前后时域对比 figure('Name', '抽取前后信号对比', 'Position', [250, 250, 1000, 600], 'NumberTitle', 'off'); subplot(2,1,1); t_orig = (0:length(baseband)-1)/Fs; t_dec = (0:length(decimated_output)-1)/Fs_new; plot(t_orig(1:200)*1e6, real(baseband(1:200))), hold on; stem(t_dec(1:ceil(200/16))*1e6, real(decimated_output(1:ceil(200/16)))); title('抽取前后信号实部对比'); xlabel('时间 (\mus)'); ylabel('幅度'); legend('原始基带', '抽取输出'); grid on; subplot(2,1,2); plot(t_orig(1:200)*1e6, imag(baseband(1:200))), hold on; stem(t_dec(1:ceil(200/16))*1e6, imag(decimated_output(1:ceil(200/16)))); title('抽取前后信号虚部对比'); xlabel('时间 (\mus)'); ylabel('幅度'); legend('原始基带', '抽取输出'); grid on; %% 保存结果 save('parallel_mixer_decimator_results.mat', 'mixed_serial', 'decimated_output', ... 'mixer_time', 'decimator_time', 'num_multipliers', 'snr', 'snr_dec', 'Fs_new'); fprintf('\n处理完成! 结果已保存。\n'); 详细解释这段代码,此代码适用的范围,梳理代码DDC的框架,以此代码为核心写写一篇期刊论文该如何进行

最新推荐

recommend-type

汽车电子领域CAN总线通信:DBC与Excel文件互转工具解析 v2.0

内容概要:本文介绍了CAN总线及其通信技术在汽车电子和工业自动化领域的应用,重点讲解了DBC文件与Excel文件之间的高效互转方法。DBC文件作为一种描述CAN通信中消息和信号的规范文件,在汽车电子领域至关重要。文中提到的工具不仅能从DBC文件中提取信息并导入到Excel文件中,还能将Excel文件的数据按DBC格式转换,支持传统CAN、CANFD及J1939协议,极大提高了转换效率和数据准确性。 适合人群:从事汽车电子、工业自动化相关工作的工程师和技术人员。 使用场景及目标:适用于需要频繁处理DBC文件与Excel文件转换的场合,如汽车开发、维护和故障诊断等,旨在提升工作效率和数据准确性。 其他说明:随着汽车电子和工业自动化技术的发展,掌握这些工具对于提高工作效率非常重要。
recommend-type

基于CAN通讯的rh850u2a16芯片Bootloader与OTA固件刷写系统 - Bootloader 必备版

基于CAN通讯的RH850U2A16芯片Bootloader及OTA刷写系统的开发过程及其功能特性。主要内容涵盖:1) CAN通讯Bootloader的设计,实现了远程固件升级;2) 配套CAPL上位机程序,便于用户操作;3) UDS服务刷写,支持多种OTA更新模式;4) Flash驱动可在RAM中运行,提升系统性能;5) 支持Boot与App互访数据,增强数据交互能力;6) 实现App有效标记检查与跳转,保障系统稳定性;7) 基于AUTOSAR标准架构,提供完整的配置工程;8) 开发了串口控制台程序,辅助调试;9) 使用量产级代码并采用GHS编译器,确保生产环境中的稳定运行。 适合人群:嵌入式系统开发者、汽车电子工程师、对CAN通讯和Bootloader感兴趣的工程师。 使用场景及目标:适用于需要远程固件升级和高可靠性的汽车电子控制系统。主要目标是提高系统的稳定性和可靠性,满足工业标准和生产需求。 其他说明:文中提到的技术和方法不仅展示了Bootloader的具体实现细节,还强调了系统设计的完整性和标准化,为后续开发和维护提供了坚实的基础。
recommend-type

年轻时代音乐吧二站:四万音乐与图片资料库

根据提供的信息,我们可以梳理出以下知识点: ### 知识点一:年轻时代音乐吧二站修正版 从标题“年轻时代音乐吧二站修正版”可以推断,这是一个与音乐相关的网站或平台。因为提到了“二站”,这可能意味着该平台是某个项目或服务的第二代版本,表明在此之前的版本已经存在,并在此次发布中进行了改进或修正。 #### 描述与知识点关联 描述中提到的“近四万音乐数据库”,透露了该音乐平台拥有一个庞大的音乐库,覆盖了大约四万首歌曲。对于音乐爱好者而言,这表明用户可以访问和欣赏到广泛和多样的音乐资源。该数据库的规模对于音乐流媒体平台来说是一个关键的竞争力指标。 同时,还提到了“图片数据库(另附带近500张专辑图片)”,这暗示该平台不仅提供音乐播放,还包括了视觉元素,如专辑封面、艺人照片等。这不仅增强了用户体验,还可能是为了推广音乐或艺人而提供相关视觉资料。 ### 知识点二:下载 影音娱乐 源代码 源码 资料 #### 下载 “下载”是指从互联网或其他网络连接的计算机中获取文件的过程。在这个背景下,可能意味着用户可以通过某种方式从“年轻时代音乐吧二站修正版”平台下载音乐、图片等资源。提供下载服务需要具备相应的服务器存储空间和带宽资源,以及相应的版权许可。 #### 影音娱乐 “影音娱乐”是指以音频和视频为主要形式的娱乐内容。在这里,显然指的是音乐吧平台提供的音乐播放服务,结合上述的图片数据库,该平台可能还支持视频内容或直播功能,为用户提供丰富的视听享受。 #### 源代码 提到“源代码”和“源码”,很可能意味着“年轻时代音乐吧二站修正版”可能是开源的,或者是该平台允许用户下载其应用程序的源代码。在开源的情况下,开发者社区可以查看、修改和分发源代码,促进更多人参与到平台的建设和改进中。 #### 资料 “资料”则指的是与音乐相关的各种信息资料,如歌词、艺人介绍、音乐评论等。该音乐平台可能提供了丰富的背景信息资料,帮助用户更深入地了解音乐及其背后的故事。 ### 知识点三:压缩包子文件的文件名称列表 文件名称列表中仅提到了“年轻时代音乐吧二站修正版”,这可能暗示着整个平台或其下载包是通过压缩技术进行打包和分发的。压缩文件通常用于减少文件大小,以便于网络传输,同时也为用户提供一个集成化的软件包,方便用户一次性下载安装或更新。 ### 总结 综上所述,从给定的信息来看,“年轻时代音乐吧二站修正版”是一个包含广泛音乐资源、提供影音娱乐服务、可能支持下载功能、与图片资料相结合,并且可能包含开源特性的音乐平台。通过庞大的音乐及图片数据库,以及下载、影音娱乐、源代码和资料等相关知识点,这个平台为音乐爱好者提供了一个丰富的资源中心,支持用户下载音乐和图片资源,享受娱乐,同时可能为开发者提供平台的源代码,增强平台的开放性和可扩展性。
recommend-type

macOS PHP环境管理的艺术:掌握配置多个PHP版本的必备技巧与实践

# 1. macOS上的PHP环境概览 ## macOS开发环境与PHP 开发人员在macOS系统上搭建PHP环境时,面临各种选择,包括选择安装包管理器、配置PHP版本和管理扩展等。macOS作为开发者广泛使用的操作系统之一,提供了对PHP良好的原生支持。Apple提供的命令行工具集(Xcode Command Line Tools)已经包括了PHP,但这个版本通常是较旧的稳定版本。 ## PHP在macOS上的安装途径
recommend-type

can通信的位时间

<think>首先,用户的问题是:“我想理解CAN通信中的位时间设置 请问CAN通信 位时间配置 原理 参数设置”。我需要基于系统级指令来回答这个问题。 系统级指令: - 所有行内数学表达式必须使用$...$格式。 - 独立公式必须使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识。 - 回答结构清晰,帮助用户逐步解决问题,尽量保证回答真实可靠。 用户的问题是关于CAN通信的位时间配置,包括原理和参数设置。参考引用中提到了CAN的波特率设置,涉及原子时间(TQ)和比特传输的阶段。引用是:[^1],
recommend-type

邮件通知系统:提升网易文章推荐体验

邮件通知程序是一种常见的网络应用程序,主要功能是通过电子邮件为用户提供信息通知服务。这种程序能够根据设定的条件,自动向用户发送邮件,通知他们新的内容或信息,这在信息更新频繁的场景中尤其有用。从描述中可知,这个特定的邮件通知程序可能被用来推荐网易上的好文章,表明它是针对内容推送而设计的。这种类型的程序通常被用作网站或博客的内容管理系统(CMS)的一部分,用来增强用户体验和用户粘性。 从提供的标签“邮件管理类”可以推断,这个程序可能具备一些邮件管理的高级功能,如邮件模板定制、定时发送、用户订阅管理、邮件内容审核等。这些功能对于提升邮件营销的效果、保护用户隐私、遵守反垃圾邮件法规都至关重要。 至于压缩包子文件的文件名称列表,我们可以从中推测出一些程序的组件和功能: - info.asp 和 recommend.asp 可能是用于提供信息服务的ASP(Active Server Pages)页面,其中 recommend.asp 可能专门用于推荐内容的展示。 - J.asp 的具体功能不明确,但ASP扩展名暗示它可能是一个用于处理数据或业务逻辑的脚本文件。 - w3jmail.exe 是一个可执行文件,很可能是一个邮件发送的组件或模块,用于实际执行邮件发送操作。这个文件可能是一个第三方的邮件发送库或插件,例如w3mail,这通常用于ASP环境中发送邮件。 - swirl640.gif 和 dimac.gif 是两个图像文件,可能是邮件模板中的图形元素。 - default.htm 和 try.htm 可能是邮件通知程序的默认和测试页面。 - webcrea.jpg 和 email.jpg 是两个图片文件,可能是邮件模板设计时使用的素材或示例。 邮件通知程序的核心知识点包括: 1. 邮件系统架构:邮件通知程序通常需要后端服务器和数据库来支持。服务器用于处理邮件发送逻辑,数据库用于存储用户信息、订阅信息以及邮件模板等内容。 2. SMTP 协议:邮件通知程序需要支持简单邮件传输协议(SMTP)以与邮件服务器通信,发送邮件到用户指定的邮箱。 3. ASP 编程:由于提及了ASP页面,这表明开发邮件通知程序可能用到 ASP 技术。ASP 允许在服务器端执行脚本以生成动态网页内容。 4. 邮件内容设计:设计吸引人的邮件内容对于提高用户互动和兴趣至关重要。邮件模板通常包括文本、图片、链接,以及可能的个性化元素。 5. 用户订阅管理:邮件通知程序需要提供用户订阅和退订的功能,以便用户可以控制他们接收到的信息类型和数量。 6. 邮件发送策略:为了遵守反垃圾邮件法律并提高邮件送达率,邮件通知程序需要实现合理的发送策略,例如定时发送、避免过度发送、邮件列表管理等。 7. 安全性和隐私保护:发送邮件时需要确保邮件内容的安全性和用户隐私,避免敏感信息泄露,并且遵守相关的数据保护法律和规范。 8. 性能优化:邮件通知程序需要有效地处理大量用户的邮件发送请求,保证邮件发送的高效性,并且优化系统性能以应对高峰时段。 9. 用户体验:良好的用户体验设计能够增加用户的互动和满意度,包括清晰的订阅界面、灵活的邮件设置选项、易于理解的通知内容等。 10. 反馈机制:用户对邮件的反馈,如打开率、点击率和退订率,是衡量邮件通知程序效果的重要指标。有效的反馈机制可以帮助改进邮件内容和发送策略。 通过了解这些知识点,我们可以对邮件通知程序的设计、开发和运作有更全面的认识。
recommend-type

【macOS PHP开发环境搭建新手必备】:使用brew一步到位安装nginx、mysql和多版本php的终极指南

# 1. macOS PHP开发环境概述 ## macOS下PHP开发的重要性 在macOS上设置PHP开发环境是开发高效Web应用程序的关键。macOS为开发者提供了一个稳定且用户友好的操作系统环境,结合了Unix的强大功能和苹果的直观界面设计。由于其Linux类似的核心,macOS常被视为Web开发的理想平台,特别是在搭
recommend-type

windows AD 组策略设置的时候是建议一个功能新建一条组策略么?还是在默认组策略上设置

<think>嗯,用户问的是在Windows AD组策略设置时,是建议每个功能新建一条组策略,还是直接在默认域策略上修改。这个问题涉及到AD管理的最佳实践。 从企业管理的角度思考,默认域策略(Default Domain Policy)作为AD安装时自动生成的策略,其实承担着基础安全配置的角色,比如密码策略、账户锁定策略这些关键设置。如果在这上面随意修改,风险确实很高——万一配置出错会影响整个域的用户和计算机。 我记得微软官方文档特别强调过要保护默认域策略。实际操作中,更合理的做法是针对不同的管理目标创建专用的组策略对象(GPO)。比如单独为"驱动器映射"、"IE安全设置"或"屏幕锁定超时
recommend-type

文件分割神器:快速压缩与管理大文件

标题《快刀斩乱麻》描述了一款文件分割软件的功能和特点。从描述中我们可以提炼出以下几个重要的知识点: 1. 文件分割功能:软件的主要用途是将一个大型文件分割成多个较小的部分。在早期计算机时代,由于存储介质(如软盘)的容量有限,常常需要将大文件拆分存储。而今,这种需求可能在移动存储设备空间受限或网络传输带宽有限的情况下仍然存在。 2. 文件管理:分割后的文件会被放置在新建的文件夹中,使得用户能够轻松管理和查看这些文件片段。这是软件为用户考虑的一个贴心功能,提高了文件的可访问性和组织性。 3. 文件合并功能:在需要的时候,用户可以将分割后的文件重新组合成原始大文件。这一功能确保了文件的完整性,方便用户在需要使用完整文件时能够快速还原。 4. 硬盘空间节省:分割并合并文件后,软件提供了一键删除输出文件的功能,以减少不必要的硬盘占用。这对于硬盘空间紧张的用户来说是非常实用的功能。 5. MP3片段提取:软件能够提取MP3文件的片段,并且从指定位置开始播放,这为音乐爱好者提供了方便。此功能可能涉及音频文件的编辑和处理技术。 6. 批处理功能:支持同时处理多个文件的分割任务。此功能可以提高处理多个大型文件时的工作效率,节省用户的时间和劳动。 7. 界面与易用性:描述中提到该软件拥有一个美观的用户界面,并且非常容易使用,即使是初次使用也能快速掌握。这对于非技术用户来说至关重要,因为它降低了使用软件的技术门槛。 8. 应用场景:软件可以在磁盘空间不足时成为用户的得力助手。这表明软件可以解决一些实际问题,满足用户特定的需求。 【压缩包子文件的文件名称列表】中包含的setup.exe文件名暗示这是一个安装程序,用户通过运行该程序可以在计算机上安装“快刀斩乱麻”软件。而readme.txt通常是一个说明文档,包含了软件的安装指南、功能介绍、操作说明或版权信息等,方便用户在安装或使用软件时查阅相关信息。 总结来说,【标题】中所述的“快刀斩乱麻”是一款针对文件分割和管理任务而设计的软件,具备文件分割、管理、合并、空间节省、音频处理和批处理等实用功能,界面设计简洁且用户友好,适用于多种场景下对文件进行高效管理。
recommend-type

【SD550螺丝刀控制器全方位攻略】:破解操作、维护、升级及故障排除的终极指南

# 摘要 本文全面介绍了SD550螺丝刀控制器的使用和维护,从基础操作到进阶功能探索,再到故障排除和性能优化。文章首先概述了SD550控制器的基本操作,包括界面熟悉和操作参数设定。进阶部分探讨了自定义程序、脚本编写以及多任务操作和管理。维护与升级章节提供了日常维护步骤和软硬件升级的具体指导,确保控制器性能稳定。故障排除章节详细讨论了问题的识别、诊断及常见操作问题的解决方法,并强调了预防性维护的重要性。案例研究和经验分享章节通过分析典型应用案例,分享了维护升级的成功经验和行业专家的见解,对未来技术趋势做出预测。总体而言,本文为用户提供了全面的操作指南、维护策略和故障解决方法,有助于提升SD550