天天看點

【FH-GFSK】FH-GFSK信号分析與盲解調研究

1.軟體版本

matlab2021a

2.系統原理

      在無線通信中,為了對抗信道衰落和保證傳輸資訊的安全常采用跳頻(Frequency Hopping, FH)通信技術。高斯移頻鍵控(Gauss Frequency Shift Keying, GFSK)具有恒幅包絡、功率譜集中、頻譜較窄等無線通信系統所希望的特性。FH-GFSK則結合了上述兩種技術的優點,是以,在數字通信中得到廣泛應用。本課題采用基于GNU Radio的軟體無線電接收機首先對FH-GFSK信号進行采集,随後對采集到的信号進行分析,最終實作信号的盲解調。通過本課題的研究,旨在加深學生對跳頻通信、高斯移頻鍵控技術的了解,掌握通信信号的分析與處理方法

1.完成5.8GHz頻段的FH-GFSK信号的采集、分析和盲解調。

2.采用基于GNU Radio的軟體無線電接收機對射頻FH-GFSK進行采集。

3.采用Matlab對采集的信号進行跳速和跳頻圖案分析,得到其跳頻圖案。

4.采用Matlab對GFSK信号的高斯濾波參數、調制指數等參數進行估計,用于完成FH-GFSK信号的盲解調。

根據參考文獻可知,GMSK解調結構如下所示:

【FH-GFSK】FH-GFSK信号分析與盲解調研究

可參考:https://wenku.baidu.com/view/1631562eb307e87101f69679.html

是以在進行盲估計時候,需要知道fc,和低通濾波器的參數,後面的是固定結構,就不用估計了。

然後題目中講到:

【FH-GFSK】FH-GFSK信号分析與盲解調研究

高斯濾波器參數,實際上就是獲得對應的低通濾波器;

然後調制指數的計算公式為:

【FH-GFSK】FH-GFSK信号分析與盲解調研究

3.部分源碼

fs          = 100e6;
Nfft        = 4096;
frameNumber = floor(length(x)/Nfft);
txBlockFFT  = zeros(frameNumber,Nfft);
for i = 0:frameNumber-1
    i
    start                   = i*Nfft;
    txBlockFFT(i+1,:)       = fftshift(fft(x(start+1:start+Nfft)));
   [maxValue maxIndex(i+1)] = max(abs(txBlockFFT(i+1,:)));
end
fc          = 5.8e9;
delta_f     = fs/Nfft;
f           = delta_f: delta_f: fs;
f           = f - fs/2;

%detect vaalid signal
validIndexCount             = 1;
validIndex                  = zeros(1,1);
validIndex(validIndexCount) = 0;
validFrameCount = 0;

axes(handles.axes1);
for i = 1:frameNumber-1
    i
    if(max(abs(txBlockFFT(i+1,:))> 280))
        validFrameCount = validFrameCount + 1;
        validFrame(validFrameCount) = i+1;
        if(abs(maxIndex(i+1) - validIndex(validIndexCount)) > 40)
           validIndexCount             = validIndexCount +1;
           validIndex(validIndexCount) = maxIndex(i+1) ;
           detectFHFc                  = validIndex(2:end)*fs/Nfft- fs/2;
        end
        detectFHResult(i+1) = maxIndex(i+1)*fs/Nfft- fs/2+fc;
        t = (0:length(detectFHResult)-1)*Nfft/fs;
        plot(t,detectFHResult,'c*');
        hold on
    end
    axis([0,0.1983,5.74e9,5.86e9]);
    pause(0.001);
    
end

 
hold on;
y_label = fc*ones(1,length(detectFHResult));
plot(t,y_label,'r');
ylim([fc-50e6 fc+50e6]);
xlabel('時間s')
ylabel('頻率Hz');
grid on;

ind1 = find(abs(detectFHResult)>0) ;
ind2 = find(detectFHResult==0) ;
detectFHResult(ind2)=[];



flag = [];
for i = 1:length(ind1)-1
    if ind1(i+1)-ind1(i) > 20
       flag = [flag,i]; 
    end
end

%鎖定頻率點
for i = 1:length(flag)
    if i == 1
       detectFHResult2(i) = mean(detectFHResult(1:flag(i))); 
    else
       detectFHResult2(i) = mean(detectFHResult(flag(i-1)+1:flag(i)));   
    end
end
 
%跳頻周期
for i = 1:length(flag)
    if i == 1
       ind12(i) = ind1(flag(i)+1)-ind1(1); 
    else
       ind12(i) = ind1(flag(i)+1)-ind1(flag(i-1)+1); 
    end
end
cycle = floor(mean(ind12));      
parameters;
t = (0:Nfft-1)/fs;
t = t';
for i=0:frameNumber-1
    start             = i*Nfft;
    txBlockFFT(i+1,:) = fftshift(fft(x(start+1:start+Nfft)));    
end
Avgs = 1000*mean2(abs(txBlockFFT));
%調制指數
%高斯濾波參數估計
indx = 0;
for i=0:frameNumber-100%分幀進行實時參數估計
    i
    [maxValue,maxIndex(i+1)]= max(abs(txBlockFFT(i+1,:)));
     if max(abs(txBlockFFT(i+1,:)))> Avgs
        indx = indx + 1;
        if(abs(maxIndex(i+1) - validIndex(validIndexCount)) > 40)
           validIndexCount             = validIndexCount +1;
           validIndex(validIndexCount) = maxIndex(i+1) ;
           detectFHFc                  = validIndex(2:end)*fs/Nfft- fs/2;
        end
        detectFHResult(i+1) = maxIndex(i+1)*fs/Nfft- fs/2+fc;
        selectFrameData     = txBlockFFT(i+1,:);
        [maxValue,maxIndex] = max(abs(selectFrameData));
        selectFHFc          = maxIndex*fs/Nfft- fs/2;
        startIndex          = (i+1)*Nfft;
        selectRxFrame(i+1,:) = x(startIndex+1:startIndex+Nfft).*(cos(2*pi*selectFHFc*t)-sqrt(-1)*sin(2*pi*selectFHFc*t));
        %去除中斷後的直接合并的信号
        selectRxFrame2(indx,:)= x(startIndex+1:startIndex+Nfft).*(cos(2*pi*selectFHFc*t)-sqrt(-1)*sin(2*pi*selectFHFc*t));
     else
        startIndex          = (i+1)*Nfft; 
        selectRxFrame(i+1,:)= x(startIndex+1:startIndex+Nfft);%無信号區域
     end
end
axes(handles.axes2);
[R,C] = size(selectRxFrame2);
Rx    = reshape(selectRxFrame2',[1,R*C]);
plot(real(Rx),'b');
xlabel('時間s')
grid on;
axis([2000,20000,-1,1]);

%資料還原成原始的一維信号
[R,C] = size(selectRxFrame2);
Rx    = reshape(selectRxFrame2',[1,R*C]);

 

%濾波器估計值
%計算帶寬,通過計算-3db頻譜範圍作為帶寬
[x0,t,ssf,yy] = plotspec(Rx,1/fs);
Y2            = 10*log10(yy/max(yy));
Y3            = Y2(length(Y2)/2:end);
indx          = find(Y3>=-3);
ssf2          = ssf(length(ssf)/2:end);
BB            = (ssf2(indx(end))-ssf2(indx(1)));
BT            = 100*BB/fs;
disp('調制指數');
set(handles.edit2,'string',num2str(BT));
Rfinal        = [];
for i = 1:R
    i
    RR           = selectRxFrame2(i,:);
    [Isignal_,h] = glpfsignal(real(RR),fs,BT);
    [Qsignal_,h] = glpfsignal(imag(RR),fs,BT);
    %濾波這塊比較費時,我這裡隻截取一部分進行處理
    Isignal  = Isignal_(1:length(RR));
    Qsignal  = Qsignal_(1:length(RR));
    %輸出二進制資料
    tmps = Isignal.*[diff(Qsignal,1),0] - Qsignal.*[diff(Isignal,1),0];
    %做下濾波處理
    tmps = tmps-mean(tmps);
    w    = hamming(128);
    tmps = conv(tmps,w);
    tmps = tmps-mean(tmps);
    Rfinal = [Rfinal,tmps];
end

tmps2= Rfinal>=0;

axes(handles.axes3);
plot(Rfinal)
axis([2000,20000,-2,3]);
axes(handles.axes4);
plot(tmps2)
axis([2000,20000,-1,2]);
 
disp('跳周期');
cycle
disp('頻率點');
detectFHResult2

fid = fopen('a.txt','wt');
for i = 1:16
    fprintf(fid,'%6.2f\n',detectFHResult2(i)); 
end
fclose(fid);      

4.仿真結論

繼續閱讀