目录
一 降采样和多相滤波器
二 升采样和多相滤波器
三 多相滤波器和信道化处理1
上图中从x(mD-p)可以看出,输入数据是从K到0,所以下面的代码里面是先x(K)到x(0),hp是从小到大顺序取值。
中,
值是从0:1:length(h)长度,其中奇数时为0,相当于在原值基础上进行了插值,这也是重叠50%的由来。
四 多相滤波器和信道化处理2
上图重叠没有画清楚,如下图所示:
当K=D时的代码:
clear
close all
freqStart = 0;%app.MhzEditField.Value*1e6;
freqEnd = 0;%app.MhzEditField_2.Value*1e6;
fs = 1600;%;app.MhzEditField_3.Value;
%构造发送数据,实际设备中不存在
signalType = 'pulse';
bandwidth = 50;
A = 1;
Fc =100;%freqStart;%将信号放在freqStart和freqEnd之间,暂时放在freqStart位置
fsRev = 1600;%暂时按照3Ghz的采样率
%半带滤波
t = [0:1/fs:1];
receiveData = exp(1i*2*pi*Fc*t);
% %% 参数设置
K = 8;
D =8 ;
fc = [0:K-1]*fs/K ;
load('passBand80Fc100Fs1600.mat')
h=passBand80Fc100Fs1600;
% hSub = (reshape(h,K,length(h)/K));
%
% % =======传统方式
len = length(receiveData);
lenH = length(h);
lensubdata = len/K;
FFTNum = 8192;
for i = 1:K
subplot(K,1,i)
receiveDatatemp = receiveData.*exp(-1i*2*pi*fc(i)*(0:len-1)/fs);
subchannelData = downsample(conv(receiveDatatemp,h,'same'),D);
fftData = fft(subchannelData,FFTNum);
plot([-FFTNum/2:FFTNum/2-1]*fs/D/FFTNum+fc(i),abs([fftData(FFTNum-FFTNum/2+1:FFTNum) fftData(1:FFTNum/2)]));
end
receiveDataArray = [receiveData];
datalen = floor(length(receiveDataArray)/D)-2;
Hlen = floor(length(h)/D)-2;
load('passBand80Fc100Fs1600.mat')
h=passBand80Fc100Fs1600;
hSub = (reshape(h,K,length(h)/K));
% % 多相滤波器信道分段为K,抽样为D=K/2
for i=1:K
datatemp = receiveDataArray(K-i+1:D:K-i+datalen*D); %注意取数据的方式为倒序
hupsample = hSub(i,:);%(upsample(hSub(i,:),2));
% sig =(-1).^((i-1)*[0:length(datatemp)-1]);%
receiveDataArray2(i,:)= conv(datatemp,hupsample,'same');
end
receiveDataArray3 = ifft(receiveDataArray2);
FFTNum = 8192;
figure
fftwhole = [];
%频谱拼接
for i = 1:K
subplot(K,1,i)
fftData = (fft(receiveDataArray3(i,:),FFTNum));
plot([-FFTNum/2:FFTNum/2-1]*fs/D/FFTNum+fc(i),abs([fftData(FFTNum-FFTNum/2+1:FFTNum) fftData(1:FFTNum/2)]));
end
aa=1;
当K=2D时的代码
%宽带分段采集,频谱拼接 电平调节
% function IFSignalReceive(app)
clear
close all
freqStart = 0;%app.MhzEditField.Value*1e6;
freqEnd = 0;%app.MhzEditField_2.Value*1e6;
fs = 1600;%;app.MhzEditField_3.Value;
Fc =1200;%freqStart;%将信号放在freqStart和freqEnd之间,暂时放在freqStart位置
t = [0:1/fs:1];
receiveData = exp(1i*2*pi*Fc*t);
% %% 参数设置
K = 8;
D =4 ;
fc = [0:K-1]*fs/K ;
load('passBand80Fc200Fs1600.mat')
h=passBand80Fc200Fs1600;
% hSub = (reshape(h,K,length(h)/K));
%
% % =======传统方式
len = length(receiveData);
lenH = length(h);
lensubdata = len/K;
FFTNum = 8192;
for i = 1:K
subplot(K,1,i)
receiveDatatemp = receiveData.*exp(-1i*2*pi*fc(i)*(0:len-1)/fs);
subchannelData = downsample(conv(receiveDatatemp,h,'same'),D);
fftData = fft(subchannelData,FFTNum);
plot([-FFTNum/4:FFTNum/4-1]*fs/D/FFTNum+fc(i),abs([fftData(FFTNum-FFTNum/4+1:FFTNum) fftData(1:FFTNum/4)]))
end
receiveDataArray = [receiveData];
datalen = floor(length(receiveDataArray)/D)-2;
Hlen = floor(length(h)/D)-2;
% load('passBand100Fc150Fs1600.mat')
load('passBand80Fc200Fs1600.mat')
h=passBand80Fc200Fs1600;
hSub = (reshape(h,K,length(h)/K));
% % 多相滤波器信道分段为K,抽样为D=K/2
for i=1:K
datatemp = receiveDataArray(K-i+1:D:K-i+datalen*D); %注意取数据的方式为倒序
hupsample = upsample(hSub(i,:),2);
datatemp = datatemp;
receiveDataArray2(i,:)=conv(datatemp,hupsample,'same');
end
receiveDataArray3 = ifft(receiveDataArray2,[],1);
FFTNum = 8192;
figure
fftwhole = [];
%频谱拼接
for i = 1:K
subplot(K,1,i)
datatemp = (-1).^((i-1)*[0:length(datatemp)-1]);
datatemp = receiveDataArray3(i,:).*datatemp;
fftData = K*(fft(datatemp,FFTNum));
plot([-FFTNum/4:FFTNum/4-1]*fs/D/FFTNum+fc(i),abs([fftData(FFTNum-FFTNum/4+1:FFTNum) fftData(1:FFTNum/4)]));
end
滤波器设置如下图:
从上面仿真可以看出,当K=D时,如果Fc为100hz时,由于频谱有盲区导致显示不到频谱,而当K=2*D时则可以显示正确的频谱