语音信号的FSK和PCM编码译码matlab仿真

目录

一、FSK技术

二、PCMK技术

三、MATLAB核心程序

四、仿真结果


       FSK(Frequency Shift Keying)和PCM(Pulse Code Modulation)是两种常见的数字信号调制和编码方法。下面将分别介绍它们的原理和数学公式。

      FSK是一种基于频率的数字调制方法,它利用不同的频率表示不同的二进制信息。FSK的原理是将二进制信息转换为对应的频率,然后将这些频率转换成的波形发送出去。接收端接收到波形后,再将其转换回二进制信息。

一、FSK技术

       2FSK信号的产生方法主要有两种,一种可以采用模拟调频电路来实现;另一种可以采用键控法来实现,即在二进制基带矩形脉冲序列的控制下通过开关电路对两个不同的独立频率进行选通,使其在每一个码元TB期间输出f1或f2两个载波之一。

FSK的数学公式可以表示为:

s(t) = A sin(2πft + φ)

其中,s(t)表示在时刻t的信号值,A表示信号幅度,f表示频率,φ表示相位。对于FSK,频率f会根据二进制信息的变化而变化。例如,当二进制信息为0时,频率为f1;当二进制信息为1时,频率为f2。因此,FSK的数学公式也可以表示为:

s(t) = A sin(2πf1t + φ) 或 s(t) = A sin(2πf2t + φ)

与2ASK信号波形相比,2FSK信号可看作是两个不同载频的2ASK信号的叠加。

二、PCMK技术

      PCM是一种基于时间的数字调制方法,它利用不同的时间间隔表示不同的二进制信息。PCM的原理是将二进制信息转换为对应的电压级别,然后将这些电压级别转换成的波形发送出去。接收端接收到波形后,再将其转换回二进制信息。

PCM的数学公式可以表示为:

s(t) = V sliced or V blanked sinc(bt - nT)

       其中,s(t)表示在时刻t的信号值,V sliced或V blanked表示电压级别,b表示采样位数,T表示采样周期,n表示采样序号。对于PCM,电压级别会根据二进制信息的变化而变化。例如,当二进制信息为0时,电压级别为0;当二进制信息为1时,电压级别为V sliced或V blanked。因此,PCM的数学公式也可以表示为:

s(t) = 0 或 s(t) = V sliced or V blanked sinc(bt - nT)

        需要注意的是,FSK和PCM在实现上还有一些具体的差异。例如,FSK需要用不同的频率来表示不同的二进制信息,因此需要用到频率调制;而PCM需要用不同的时间间隔来表示不同的二进制信息,因此需要用到时间调制。此外,FSK和PCM在信号的接收端也需要采用不同的解调方法来将信号还原成原始的二进制信息。

三、MATLAB核心程序

.................................................................................
%% 量化
temp=round(4096*y);
v=1;
%% 编码
y_code = pcm_encode(temp);

%% 波形生成
len1=length(y_code);
samp=24;   %samp扩大一倍,为了使调制后的信号波形更完整
temp1=ones(samp,1)*(abs(y_code)>=1);    
temp=reshape(temp1,1,len1*samp);      
%temp5=temp;
%clear temp1;
Fs1=Fs*samp;
tnrn1=[1:length(temp)]/Fs1;
fnrn1=[-length(temp)/2:length(temp)/2-1]/length(temp)*Fs1;
%% FSK调制
fc=Fs*2;

temp2=~temp;      %2FSK可看作两个2ASK信号的叠加,这两个2ASK信号的调制信号为码反关系

s_local=cos(2*pi*fc*tnrn1);%载波信号
s_local2=cos(2*pi*2*fc*tnrn1); 
temp=temp.*s_local;   %调制信号
temp2=temp2.*s_local2;

TEMP=temp+temp2;   %2FSK信号
plot(TEMP(1:1000));      
xlabel('t/s');ylabel('信号幅值');title('2FSK调制后的时域波形');
figure;
FTEMP=fft(TEMP);
plot(FTEMP);xlabel('频域');ylabel('幅值');title('调制后频域波形');
figure;
%% 信道
noise_delta = .1;
noise=randn(size(TEMP))*noise_delta;      %噪声性能
max_signal = abs(max(TEMP));
TEMP=TEMP+noise;
clear noise

[N,WC]=buttord(Fs*2*pi,Fs*4*pi,1,20,'s');   %低通
[B,A]=butter(N,WC,'s');
[H,wl]=freqs(B,A,fnrn1*2*pi);
win=abs(H); 
plot(fnrn1,win);
figure;

wp1=[fc-Fs/2,fc+Fs/2]*2*pi;     %带通1
ws1=[fc-Fs,fc+Fs]*2*pi;
[N1,WC1]=buttord(wp1,ws1,1,20,'s');
[B1,A1]=butter(N1,WC1,'s');
[H1,w2]=freqs(B1,A1,fnrn1*2*pi);
win1=abs(H1);
plot(fnrn1,win1);
figure;

wp2=[2*fc-Fs/2,2*fc+Fs/2]*2*pi;   %带通2
ws2=[2*fc-Fs,2*fc+Fs]*2*pi;
[N2,WC2]=buttord(wp2,ws2,1,20,'s');
[B2,A2]=butter(N2,WC2,'s');
[H2,w3]=freqs(B2,A2,fnrn1*2*pi);
win2=abs(H2);
plot(fnrn1,win2);
figure;

SNR = 10*log10(max_signal^2/noise_delta^2/2/(length(find(abs(fnrn1)>=fc-Fs/2 & abs(fnrn1)<=fc+Fs/2))/length(fnrn1))) %接收端信噪比
Pe=1/sqrt(2*pi*SNR)*exp(-1/2*SNR)   %误码率
%% FSK解调
TEMP=fftshift(fft(TEMP));
TEMP1=TEMP.*win1;        %经带通分成两路
TEMP2=TEMP.*win2;
TEMP1=ifft(ifftshift(TEMP1))*2;  
TEMP2=ifft(ifftshift(TEMP2))*2;  
s_local=cos(2*pi*fc*tnrn1);
s_local2=cos(4*pi*fc*tnrn1); 
TEMP1=TEMP1.*s_local;     %相干解调
TEMP2=TEMP2.*s_local2;
clear s_local
TEMP1=fftshift(fft(TEMP1)); 
TEMP2=fftshift(fft(TEMP2)); 
TEMP1=TEMP1.*win;   %低通滤波器
TEMP2=TEMP2.*win;
clear win
TEMP1=ifft(ifftshift(TEMP1))*2;  
TEMP2=ifft(ifftshift(TEMP2))*2;  
%抽样判决
up2214

四、仿真结果

猜你喜欢

转载自blog.csdn.net/ccsss22/article/details/133191676