``` % 参数设置 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程序每次运行后解调后的基带图像都不一样
时间: 2025-07-11 07:39:31 浏览: 14
<think>嗯,用户问为什么每次运行这个MATLAB程序后解调后的基带图像都不一样。首先,我需要仔细看看代码,找出可能的原因。这个程序涉及到AM调制解调,还有噪声的生成。噪声部分可能是关键,因为如果噪声是随机生成的,每次运行结果可能不同。
首先,检查噪声生成的部分。用户定义了一个函数noise_nb,里面调用了randn函数生成随机数。randn每次运行都会产生不同的白噪声样本,所以添加的噪声每次都不一样。这会导致解调后的信号受到不同的噪声影响,从而图像不同。
接下来,看看整个流程。基带信号mt是确定的,但调制后的信号s_am_noisy加入了随机噪声。解调过程中,虽然使用了相干解调,但噪声的存在会影响解调结果。低通滤波后,噪声可能没有被完全滤除,残留的噪声导致每次波形不同。
另外,检查是否有其他随机因素。比如,是否在生成载波或者基带信号时用了随机数?但看起来mt是确定的,载波也是固定的频率和幅度。所以主要随机源应该是噪声生成部分。
用户可能对噪声的影响不太清楚,或者没有意识到随机数生成会导致结果变化。需要解释为什么噪声是随机的,以及这种随机性如何影响解调后的信号。
还要确认程序是否有其他潜在问题,比如滤波器设计是否合理,采样频率是否足够,但根据参数,fs=10*fc,应该没问题。低通滤波器的截止频率设为fm,可能刚好能保留基带信号,但噪声带宽B=2*fm,可能在滤波后仍有部分噪声残留。
总结起来,主要原因是每次生成的噪声不同,导致解调后的信号带有随机成分,图像变化。解决办法可以是固定随机数种子,使每次噪声相同,或者用户可能希望了解如何评估解调性能,比如多次运行取平均。</think>这个MATLAB程序每次运行后解调基带信号图像不同的原因在于**窄带高斯噪声的随机性**。以下是具体分析:
---
### 1. 噪声生成的核心问题
在函数`noise_nb`中,噪声生成的关键代码如下:
```matlab
rn = sqrt(p) * randn(1, n_len); % 生成白噪声
```
- **`randn`函数**会生成**服从标准正态分布的随机数**,每次运行都会产生不同的随机序列。
- 因此,噪声`noise`的时域波形在每次运行时都是**完全随机**的。
---
### 2. 噪声对解调的影响过程
#### (1) 调制信号中的噪声叠加
AM调制信号叠加噪声的代码:
```matlab
s_am_noisy = s_am + noise; % 添加噪声
```
- 噪声`noise`的随机性直接导致`$s_{\text{am\_noisy}}(t)$`的时域波形不同。
#### (2) 解调过程中的噪声传递
解调时通过相干解调(乘积+低通滤波):
```matlab
rt = s_am_noisy .* cos(2 * pi * fc * t); % 相干解调
```
- 噪声分量会与载波相乘,部分噪声能量被搬移到基带范围内。
- 低通滤波器(截止频率`$f_m$`)无法完全滤除带内噪声,导致解调后的基带信号`$r_{\text{filtered}}(t)$`残留**随机噪声**。
---
### 3. 直观验证方法
#### 方法1:固定随机数种子
在程序开头添加:
```matlab
rng(0); % 固定随机数生成器种子
```
- 强制`randn`生成相同的随机序列,噪声波形将不再变化。
#### 方法2:观察噪声功率的影响
修改噪声功率谱密度`N0`:
- 当`N0 = 0`时,解调信号完全确定,波形固定。
- 增大`N0`时,噪声引起的波形抖动会更加明显。
---
### 4. 理论依据
#### 窄带噪声的时域表达式
窄带高斯噪声可表示为:
$$n(t) = n_c(t)\cos(2\pi f_c t) - n_s(t)\sin(2\pi f_c t)$$
其中`$n_c(t)$`和`$n_s(t)$`是**独立同分布的低通高斯过程**,其随机性导致解调后的基带信号:
$$r_{\text{filtered}}(t) = m(t) + \frac{n_c(t)}{2}$$
- 基带信号`$m(t)$`被确定性恢复,但叠加了随机噪声`$\frac{n_c(t)}{2}$`。
---
### 5. 结论
- **每次运行生成的噪声不同** → **解调后的噪声残留不同** → **基带信号图像不同**。
- 这是通信系统中噪声随机性的正常现象,实际应用中需通过统计方法(如误码率)评估系统性能。
如果需要稳定的输出结果,可通过**固定随机数种子**(如`rng(0)`)实现。
阅读全文
相关推荐



















