Initial ARSS. Need to improve and add functions.
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
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
|
||||
Reference in New Issue
Block a user