Generating Signals

Sinusoids

real

n_samples  = 100; 
f          = 100; % frequency of signal
fs         = 500; % sampling rate
signal     = cos(2*pi*(0:n_samples-1)*f/fs); 

complex

n_samples  = 100; 
f          = 100; % frequency of signal
fs         = 500; % sampling rate
signal     = exp(1i*2*pi*(0:n_samples-1)*f/fs); 

QPSK Signal

n_samples   = 100; 
qpsk_signal = (floor(2*rand(1,n_samples))-0.5)/0.5 + 1j*(floor(2*rand(1,n_samples))-0.5)/0.5;

Plot FFT

nfft        = 4096;
freq_on_bin = 1000 * 1/nfft; 
signal      = exp(1i*2*pi*freq_on_bin*(0:nfft-1));
signal_fft  = fftshift(20*log10(abs(fft(signal,nfft))));
xaxis       = -0.5:1/nfft:0.5-1/nfft; 
figure
plot(xaxis, signal_fft)

Generating Noise

Real Noise

% starting with some noise sigma (noise_sigma)
noise_variance = noise_sigma^2; 
noise_signal   = sqrt(noise_variance) .* (randn(1, n_samples));

Complex Noise

% starting with some noise sigma (noise_sigma)
noise_variance = noise_sigma^2; 
noise_signal   = sqrt(noise_variance/2) .* (randn(1, n_samples) + 1i*randn(1, n_samples));

Polyphase Filter Matlab Code

Polyphase Decimation

% D is your decimation rate
coefs_poly     = reshape(coefs,D,[]);
reg            = zeros(D,size(coefs_poly,2));
v0             = zeros(1,D)';
input_signal   = [1 zeros(1,200)]; % impulse
output_signal  = zeros(1,length(input_signal)/D);

% polyphase decimation filter is "calculate 1 output from D inputs"
out_idx = 1;
for n=1:D:length(input_signal)-D
    v0  = fliplr(input_signal(n:n+D-1)).'; % get D inputs from input signal
    reg = [v0 reg(:,1:size(reg,2)-1)];     % deliver D inputs, shift register values over one

    % calculate 1 output from D inputs
    % apply all polyphase filters to the data
    for k=1:D                        
      output_reg = output_reg + reg(k,:)*coefs_poly(k,:)'; % sum all polyphase paths together
    end
    
    output_signal(out_idx) = output_reg; % set output
    out_idx                = out_idx+1;
end

Polyphase Interpolation

% coefs are your FIR filter coefficients (firpm, remez, etc)
% I is your interpolation rate

coefs_poly     = reshape(coefs,I,[]);
reg            = zeros(I,size(coefs_poly,2)); % I x filter_length/I
input_signal   = [1 zeros(1,200)]; % impulse
output_signal  = zeros(1,length(input_signal)*I);

% polyphase interpolation filter is "calculate I outputs from 1 input"
out_idx = 1;
for n=1:length(input_signal)
    reg = [input_signal(n) reg(:,1:size(reg,2)-1)]; % deliver 1 input

    % calculate I outputs from the 1 input
    for path=1:I                 
      output_signal(out_idx) = reg * coefs_reshape(path,:)';  % sum all polyphase paths together
      out_idx = out_idx + 1; 
    end
end