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