Files
ARSS/03. Rx Path/generate_phase_noise_from_datasheet.m
T

59 lines
1.7 KiB
Matlab

function phi_noise = generate_phase_noise_from_datasheet(t, phaseNoiseCfg)
% DATASHEET 기반 SSB phase noise(dBc/Hz) 마스크로 시간영역 위상잡음(rad) 생성
% 입력:
% t : 시간 벡터 [1xN] 또는 [Nx1] (초)
% phaseNoiseCfg.offset_Hz : 오프셋 주파수 벡터(Hz)
% phaseNoiseCfg.level_dBc_Hz : 각 오프셋에서의 SSB phase noise (dBc/Hz)
% 출력:
% phi_noise : 시간영역 위상잡음 [1xN] (rad)
t = t(:);
N = numel(t);
phi_noise = zeros(1, N);
if N < 2
return;
end
dt = mean(diff(t));
fs = 1 / dt;
df = fs / N;
offsets = phaseNoiseCfg.offset_Hz(:);
levels_dBc = phaseNoiseCfg.level_dBc_Hz(:);
valid = isfinite(offsets) & isfinite(levels_dBc) & offsets > 0;
offsets = offsets(valid);
levels_dBc = levels_dBc(valid);
if isempty(offsets)
return;
end
[offsets, order] = sort(offsets, 'ascend');
levels_dBc = levels_dBc(order);
f_pos = (1:floor(N/2))' * df;
if isempty(f_pos)
return;
end
if numel(offsets) == 1
L_dBc = levels_dBc(1) * ones(size(f_pos));
else
L_dBc = interp1(log10(offsets), levels_dBc, log10(f_pos), 'linear', 'extrap');
end
% SSB phase noise L(f) 와 위상 PSD 관계: L(f) ~= 0.5 * S_phi(f)
% => S_phi(f) ~= 2 * 10^(L(f)/10) [rad^2/Hz]
S_phi = 2 * 10.^(L_dBc / 10);
% 협대역 랜덤 사인 성분 합성
amp = sqrt(2 * S_phi * df); % 각 톤 진폭(rad)
rand_phase = 2 * pi * rand(size(f_pos));
t_rel = t - t(1);
% NxK 행렬 계산
phase_matrix = 2*pi*(t_rel * f_pos.') + rand_phase.';
phi_noise = (cos(phase_matrix) * amp).';
phi_noise = phi_noise(:).';
end