2FSK matlab模擬實現

2021-09-29 11:27:49 字數 3753 閱讀 3718

就是最簡單的實現乙個2fsk,先不管這種調製方法的性質

其實就是太懶了不想學

rb=100;%設定碼元速率

sample=randbinary(n);%生成隨機二進位制序列

%設定傳送波形引數

f1=8000;

f0=12000;

%傳送波形取樣

fs=48000;

send=modulation_2fsk(sample,[f0 f1],rb,fs);

%傳送sound(send,fs);

plot(send);

附:

自定義函式說明:

產生隨機二進位制序列

function [ seq ] = randbinary( n )

% 輸入需要生成序列的長度n

% 產生乙個隨機01序列,長度為n

%% 如生成乙個長度為1000的隨機二進位制序列

% sample=randbinary(1000);

seq=zeros(1,n);

for i=1:n

ele=ceil(rand()*10);

seq(i)=mod(ele,2);

endend

對單極性不歸零序列進行2fsk調製

採用鍵控法,碼元為1或0時將傳送其對映的波形

function [ send ] = modulation_2fsk( sample,f,rb,fs )

% 2fsk調製

% 輸入待調製的單極性不歸零序列sample和碼元速率rb

% 傳送頻率[f0 f1]

tb=1/rb;

ts=1/fs;

temp=[0];

send=[0];

n=length(sample);

for i=1:n

temp=i*tb:ts:(i+1)*tb-ts/10;

if sample(i)

send=[send cos(2*pi*f(2)*temp)];

else

send=[send cos(2*pi*f(1)*temp)];

endend

send=send(2:end);

end

然後是對接收訊號進行解調.以下為解調的超理想模式,通道完全無雜訊無衰減!其實根本沒傳輸

因為沒有雜訊不用提取載波,只要對訊號平方在通過lpf即可恢復序列

function [ ] = demodulation_2fsk( rcv,f,fs )

% 2fsk解調函式

% 輸入接收訊號rcv和傳送頻率[f0 f1]

% fs為接收訊號的取樣頻率

% 輸出恢復01序列(暫無),顯示抽樣判決前波形

ts=1/fs;

len=length(rcv);

t=0:ts:(len-1)*ts;

%恢復載波

aid1=cos(2*pi*f(2)*t);

aid0=cos(2*pi*f(1)*t);

%定義濾波器(fpass=500,fstop=2k)

lpf=[-0.000155833996394978,-8.13831647659670e-05,-9.20002718367755e-05,-9.34081381696587e-05,-8.07905288388760e-05,-4.82295684201173e-05,1.10503665725242e-05,0.000104811978995989,0.000241591960167609,0.000430822839276432,0.000682264219483239,0.00100598263039256,0.00141205216632109,0.00191075149567522,0.00251102822992922,0.00322157539693270,0.00404950826762152,0.00500032696122431,0.00607774423655064,0.00728301069263170,0.00861503729572713,0.0100699084385198,0.0116408437704915,0.0133180094004704,0.0150886733499124,0.0169371703821178,0.0188450158385386,0.0207913578208965,0.0227530878451301,0.0247053521313381,0.0266220811202588,0.0284763137354778,0.0302410586230369,0.0318896464873665,0.0333964895832343,0.0347376010424772,0.0358912330554356,0.0368383387237662,0.0375630659622750,0.0380532056874610,0.0383003706934961,0.0383003706934961,0.0380532056874610,0.0375630659622750,0.0368383387237662,0.0358912330554356,0.0347376010424772,0.0333964895832343,0.0318896464873665,0.0302410586230369,0.0284763137354778,0.0266220811202588,0.0247053521313381,0.0227530878451301,0.0207913578208965,0.0188450158385386,0.0169371703821178,0.0150886733499124,0.0133180094004704,0.0116408437704915,0.0100699084385198,0.00861503729572713,0.00728301069263170,0.00607774423655064,0.00500032696122431,0.00404950826762152,0.00322157539693270,0.00251102822992922,0.00191075149567522,0.00141205216632109,0.00100598263039256,0.000682264219483239,0.000430822839276432,0.000241591960167609,0.000104811978995989,1.10503665725242e-05,-4.82295684201173e-05,-8.07905288388760e-05,-9.34081381696587e-05,-9.20002718367755e-05,-8.13831647659670e-05,-0.000155833996394978];

%濾除高頻部分,保留低頻分量

rcv1=filter(lpf,1,rcv.*aid1);

rcv0=filter(lpf,1,rcv.*aid0);

%歸一化

rcv1=rcv1/max(abs(rcv1));

rcv0=rcv0/max(abs(rcv0));

figure

plot(t,abs(rcv1),'-r');

grid on

hold on

plot(t,abs(rcv0),'-g');

title('接受恢復');xlabel('秒/s');

legend('1接收','0接收')

end

在解調的過程中,我們要注意由於通道的隨機衰減,可能導致針對某部分頻譜分量的大量衰減,從而不能分辨.為了應對這種情況,我們就需要對經過lpf後的訊號進行歸一化,從而消除因幅度不同而導致的誤差.不能在接收訊號後就進行歸一化,因為訊號中只有部分頻率分量是衰減的,對整個訊號進行歸一化後並不能使衰減訊號恢復到正常值.

Vue資料驅動模擬實現2

一 前言 在隨筆 模擬vue之資料驅動1 結尾處,我們說到如果監聽的屬性是個物件呢?那麼這個物件中的其他屬性豈不就是監聽不了了嗎?如下 倘若user中的name age屬性變化,如何知道它們變化了呢?今兒,就來解決這一問題。通過走讀vue原始碼,發現他是利用observer建構函式為每個物件建立乙個...

模擬實現Spring IOC

通過在類上標註 registration 註冊進容器,injection從容器注入物件 容器類 public class springcontainer else bean.setbeanclass c mappropsmap new hashmap 處理注入屬性 field props c.get...

模擬實現strcmp

函式簡介 原型 int strcmp const char s1,const char s2 所在標頭檔案 string.h 功能 比較字串s1和s2。一般形式 strcmp 字串1,字串2 說明 當s1注意不是 1 當s1 s2時,返回值 0 當s1 s2時,返回正數 注意不是1 如下 int m...