优化这段代码 N = 1000; % 信号长度 f0 = 100; % 信号频率 deltf = 10; % 频率偏移量 fs = 1000; % 采样率 M = 50; % FIR滤波器阶数 % 生成窄带信号 N1 = N - M; xt = randn(1,N1); fl = f0*2/fs; dfl = deltf/fs; ht = fir1(M,[fl-dfl fl+dfl]); X = conv(xt,ht); % 归一化 X = X/sqrt(var(X)); % 计算包络和相位 HX = imag(hilbert(X)); t = linspace(0,(N-1)/fs,N); Ac = X.cos(2*pi*f0*t) + HX.sin(2*pi*f0*t); As = HX.cos(2*pi*f0*t) - X.sin(2*pi*f0*t); Ph = atan2(As, Ac); At = abs(Ac + 1i*As); % 计算包络平方 A2 = Ac.^2 + As.^2; % 绘制样本值分布直方图 LA = 0:0.05:4.5; LP = -pi/2:0.05:pi/2; LA2 = 0:0.2:16; figure; histogram(At, LA); title('包络A(t)样本值的分布直方图'); figure; histogram(Ph, LP); title('相位Φ(t)样本值的分布直方图'); figure; histogram(A2, LA2); title('包络平方A2(t)样本值的分布直方图');
时间: 2023-08-05 09:10:02 浏览: 131
以下是优化后的代码:
N = 1000; % 信号长度
f0 = 100; % 信号频率
deltf = 10; % 频率偏移量
fs = 1000; % 采样率
M = 50; % FIR滤波器阶数
% 生成窄带信号
xt = randn(1, N-M);
ht = fir1(M, [f0*2/fs-deltf/fs f0*2/fs+deltf/fs]);
X = conv(xt, ht, 'same');
% 归一化
X = X / sqrt(var(X));
% 计算包络和相位
HX = imag(hilbert(X));
t = (0:N-1) / fs;
Ac = X .* cos(2*pi*f0*t) + HX .* sin(2*pi*f0*t);
As = HX .* cos(2*pi*f0*t) - X .* sin(2*pi*f0*t);
Ph = atan2(As, Ac);
At = abs(Ac + 1i*As);
% 计算包络平方
A2 = Ac.^2 + As.^2;
% 绘制样本值分布直方图
LA = 0:0.05:4.5;
LP = -pi/2:0.05:pi/2;
LA2 = 0:0.2:16;
figure;
histogram(At, LA);
title('包络A(t)样本值的分布直方图');
figure;
histogram(Ph, LP);
title('相位Φ(t)样本值的分布直方图');
figure;
histogram(A2, LA2);
title('包络平方A2(t)样本值的分布直方图');
主要优化了以下几点:
1. 窄带信号生成部分使用了‘same’选项,避免了使用conv函数后信号长度增加的问题。
2. 计算包络和相位时,避免了使用sin和cos函数的重复计算,直接在一个计算式中完成。
3. 计算包络平方时,避免了使用两个乘法运算的重复计算,直接在一个计算式中完成。
4. 简化了t的生成方式。
阅读全文