Forums

Multichannel Sampling - Filtering in Freq. Domain

Started by scott_t72 January 16, 2010
Hi, I am creating a Matlab model of a multichannel system where the input signal is sampled below the Nyquist rate in each channel, but is still recoverable because each channel has a uniform phase offset. In this case there are M=3 channels that sample at half the Nyquist Rate (L=2). The channels have uniform phase offsets of [0 Tsamp/3 2*Tsamp/3]. When corrected and interleaved, the output should be a perfect reconstruction of the input.

This is fairly simple conceptually, but I am having trouble implementing the reconstruction filters in the frequency domain. Does anyone have any ideas?

===============================================
clear;
clc;

M = 3; %M=Sampling Channels
L = 2; %L=Undersampling Ratio for each Channel

%Define Nyquist Frequency Bandlimit for Input Signals
fn = 21;
Tn = 1/fn;

%Define Sampling Offsets
Tsamp = L*Tn;
fsamp = 1/Tsamp;

%Phase Offset Between Channels
tau_m = [0 Tsamp/3 2*Tsamp/3];

%Define Sampling Grids
tmin = 0;
tmax = 100*1/0.5;

t0 = (tmin+tau_m(1)):Tsamp:tmax;
t1 = (tmin+tau_m(2)):Tsamp:tmax;
t2 = (tmin+tau_m(3)):Tsamp:tmax;

t0 = t0(1:(length(t0)-1));

%Sample Input Signal
x0 = cos(2*pi*10*t0);
x1 = cos(2*pi*10*t1);
x2 = cos(2*pi*10*t2);

x0 = upsample(x0,L);
x1 = upsample(x1,L);
x2 = upsample(x2,L);

%FFT of Input Signal
X0 = fft(x0)/length(x0);
X1 = fft(x1)/length(x1);
X2 = fft(x2)/length(x2);

%Define Frequency Grid for Sampling Reconstruction Filters
omega_mat0 = linspace(-pi,pi-2*pi/length(X0),length(X0));
omega_mat1 = linspace(-pi,pi-2*pi/length(X1),length(X1));
omega_mat2 = linspace(-pi,pi-2*pi/length(X2),length(X2));

%Reconstruction Filtering (Frequency Domain)
OUT0 = X0.*fftshift(2/3); %No Shift
OUT1 = X1.*fftshift(2/3*exp(j.*omega_mat1*2/3)); %Phase Correction for Interleaving
OUT2 = X2.*fftshift(2/3*exp(j.*omega_mat2*4/3)); %Phase Correction for Interleaving

OUT = OUT0+OUT1+OUT2;

figure
subplot(2,1,1)
stem(omega_mat2,fftshift(real(OUT)))
title('FFT OUT Total After Filters');
xlabel('Frequency (rad/s)');
ylabel('Real');

subplot(2,1,2)
stem(omega_mat2,fftshift(imag(OUT)),'r')
title('FFT OUT Total After Filters');
xlabel('Frequency (rad/s)');
ylabel('Imag');