function [x_blocker, info] = generate_blocker_v1_1(N)
        % Version 1.1 (01052026)
if nargin < 1
    N = 1e5;
end

%% Parameters
fs = 1e9;
BW = 200e6;
OSR = fs / BW;   

assert(mod(N,OSR)==0, 'N must be multiple of OSR (5)');

%% Seed (IMPORTANT for reproducibility)
seed = 777;
rng(seed);

%% Generate QAM
data = randi([0 15], N/OSR, 1);
symbols = qammod(data, 16, 'UnitAveragePower', true);

%% Upsample
x_up = upsample(symbols, OSR);

%% RRC filter
rrc = rcosdesign(0.25, 20, OSR);
x_blocker = conv(x_up, rrc, 'same');

%% Ensure column vector
x_blocker = x_blocker(:);

%% Normalize
x_blocker = x_blocker / rms(x_blocker);

%% Info (VERY IMPORTANT)
info.fs   = fs;
info.BW   = BW;
info.OSR  = OSR;
info.seed = seed;
info.type = 'inband';

%% Save interferer (competition requirement)
filename = 'interferer.mat';
save(filename, 'x_blocker', 'info');

fprintf('Interferer saved to %s\n', filename);

end