赞
踩
目录
上图中从x(mD-p)可以看出,输入数据是从K到0,所以下面的代码里面是先x(K)到x(0),hp是从小到大顺序取值。
中,
值是从0:1:length(h)长度,其中奇数时为0,相当于在原值基础上进行了插值,这也是重叠50%的由来。
上图重叠没有画清楚,如下图所示:
当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时则可以显示正确的频谱
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。