59 lines
1.7 KiB
Matlab
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
|