Bootstrap

Matlab实现滤波器,进行ASK、FSK、多音信号的滤波

目录

绪论

一 :滤波器设计

二:ASK、FSK、多音信号产生

三:滤波

绪论

(1)以下是matlab破解版本的百度网盘资源:
链接:https://pan.baidu.com/s/1ORFFWE4ZCOqaVZgadm0cnw
提取码:7ybv
(2)要使用matlab,首先要知道matlab中的基本操作。大家可以借助matlab中自带的help文档来帮助学习。打开matlab的界面有如下问号 点击进入帮助文档.帮助文档
(3)帮助文档可以帮助你快速入门matlab的基础操作 ,我们在帮助文档中可以直接搜索需要的函数,对英文不熟悉的话可以搜索原本的英文翻译过来,多多查阅资料。弄懂函数的作用和代码的写法。

一:滤波器设计

(1)在matlab中设计滤波器可以有两种方法
1 编写函数代码。
2 使用matlab自带的滤波器设计分析程序。
(本博客为了方便设计只介绍2 种方法。)
打开matlab的应用程序界面找到 Filter Design and Analysis (fda-tool)如图:
fda-tool
打开之后出现如图的界面在这里插入图片描述
下方可以设置滤波器的类型、设计的采用什么算法、阶数、通带截至频率、阻带截至频率、通带和阻带衰减。比如我们设计一个FIR低通滤波器,采用、等波纹设计法(Equiripple)、十阶、通带截至频率和阻带截至频率Fp=500Hz Fs=600Hz。参数设置完毕后点Design Filter可以得到设计的滤波器的幅度和相位响应。如下图:在这里插入图片描述
这样一个简单的滤波器就设计完毕了。然后我们可以将设计的滤波器直接生成Matlab代码,方法是
file>>Generate Matlab code>>Filter Design Function 将我们的代码保存到待会儿需要使用的文件夹中。生成的代码是这样的:

function Hd = FIR_LPF600
%FIR_LPF600 Returns a discrete-time filter object.

% MATLAB Code
% Generated by MATLAB(R) 9.0 and the Signal Processing Toolbox 7.2.
% Generated on: 12-Dec-2019 16:59:56

% Equiripple Lowpass filter designed using the FIRPM function.

% All frequency values are in Hz.
Fs = 3000;  % Sampling Frequency

N     = 10;   % Order
Fpass = 500;  % Passband Frequency
Fstop = 600;  % Stopband Frequency
Wpass = 20;   % Passband Weight
Wstop = 500;  % Stopband Weight
dens  = 20;   % Density Factor

% Calculate the coefficients using the FIRPM function.
b  = firpm(N, [0 Fpass Fstop Fs/2]/(Fs/2), [1 1 0 0], [Wpass Wstop], ...
           {dens});
Hd = dfilt.dffir(b);

% [EOF]

在这里插入图片描述
滤波器的设计完成。

二:ASK、FSK、多音信号产生

(1):ASK基带信号
ASK基带信号就是二进制基带信号,只有0 1电平,用来传送二进制代码。我们可以用以下代码生成:

% ASK基带信号: st1 
% 2ASK调制信号:  ASK
% 2FSK调制信号: FSK
%多音信号:  y_m1 y_m13 y_m135 y_m1357

i=1000;%基带信号码元数
j=20000;%  fm.*/1000
f1 = 1000;
f2 = 500;
t=linspace(0,1,j);%0-1之间产生20000个点行矢量,即将[0,1]分成20000份
fm=i;%基带信号的频率
a=round(rand(1,i));%产生随机序列
st1=t;
for n=1:1000
    if a(n)<1
        for m=j/i*(n-1)+1:j/i*n
            st1(m)=0;
        end
    else
        for m=j/i*(n-1)+1:j/i*n
            st1(m)=1;
        end
    end
end
figure(1);
subplot(211);plot(t,st1);title('ASK基带信号');
axis([0 0.05 0 1]);
xlabel('t / s')
ylabel('amplitude')

在这里插入图片描述
然后我们可以观察其频谱:

f_real = (-500:500-1) * fm / 1000; %真实的采样点数
y = fft(st1,1000);title('ASK基带信号');
subplot(212);plot(f_real,20.*log10(abs(y)/max(abs(y))));
xlabel('frequency / hz')
ylabel('magnitude / dB')

得到的结果是这样子的:
在这里插入图片描述
(2)FSK信号的产生
FSK信号是二进制基带的信号的频率调制方式,是两个不同频率的正弦载波与基带信号和基带信号的取反分别相乘 然后再相加得到的,我们设正弦载波的频率是500Hz 和1000Hz 采用下列代码生成:

%基带信号求反
st2=t;
for n=1:j
    if st1(n)==1
        st2(n)=0;
    else
        st2(n)=1;
    end
end
subplot(412);
plot(t,st2);
title('基带信号反码st2');
%调制
ASK=st1.*s1;%加入载波1
F2=st2.*s2;%加入载波2

subplot(221);
plot(t,ASK);title('2ASK=s1*st1');
axis([0 0.05 -1 1]);
xlabel('t / s')
ylabel('amplitude')


FASK = fft(ASK,f1);
subplot(222);plot(f_real,20.*log10(abs(FASK)/max(abs(FASK))));title('2ASK信号');
xlabel('frequency / hz')
ylabel('magnitude / dB')


FSK=ASK+F2;
subplot(223);
plot(t,FSK);title('2FSK信号')
axis([0 0.05 -1 1]);
xlabel('t / s')
ylabel('magnitude / dB')

FFSK = fft(FSK,f1);
subplot(224);plot(f_real,20.*log10(abs(FFSK)/max(abs(FFSK))));title('2FSK信号');
xlabel('frequency / hz')
ylabel('magnitude / dB')

得到ASK调制信号和FSK调制信号的波形和频谱:
在这里插入图片描述
(3)多音信号
多音信号就是多种频率的复合信号,这里我们采用正弦信号来复合。

%多音信号
N = 1/1000;
x = 0:N:1;
f_m = 200;
y_m1 = cos(1.*pi.*x.*f_m);
y_m13 = cos(1.*pi.*x.*f_m)+1/3.*cos(3.*pi.*x.*f_m);
y_m135 = cos(1.*pi.*x.*f_m)+1/3.*cos(3.*pi.*x.*f_m)+1/5.*cos(5.*pi.*x.*f_m);
y_m1357 = cos(1.*pi.*x.*f_m)+1/3.*cos(3.*pi.*x.*f_m)+1/5.*cos(5.*pi.*x.*f_m)+1/7.*cos(7.*pi.*x.*f_m);
y_f1 = fft(y_m1);
y_f13 = fft(y_m13);
y_f135 = fft(y_m135);
y_f1357 = fft(y_m1357);
figure(3)
subplot(421);plot(x,y_m1);title('基波');
axis([0 0.05 -1 1]);
xlabel('t / s')
ylabel('amplitude')
subplot(422);plot(abs(y_f1));title('基波')
xlabel('frequency / hz')
ylabel('magnitude')

subplot(423);plot(x,y_m13);title('基波和3次谐波');
axis([0 0.05 -1 1]);
xlabel('t / s')
ylabel('amplitude')
subplot(424);plot(abs(y_f13));title('基波和3次谐波')
xlabel('frequency / hz')
ylabel('magnitude')

subplot(425);plot(x,y_m135);title('基波和3、5次谐波');
axis([0 0.05 -1 1]);
xlabel('t / s')
ylabel('amplitude')
subplot(426);plot(abs(y_f135));title('基波和3、5次谐波')
xlabel('frequency / hz')
ylabel('magnitude')

subplot(427);plot(x,y_m1357);title('基波和3、5、7次谐波');
axis([0 0.05 -1 1]);
xlabel('t / s')
ylabel('amplitude')
subplot(428);plot(abs(y_f1357));title('基波和3、5、7次谐波')
xlabel('frequency / hz')
ylabel('magnitude')

得到每个多音信号的波形和频谱:
在这里插入图片描述

三:滤波

当我们将需要的信号生成好之后,我们可以直接调用filter函数调用方式是:
x_f = filter(HD,fx)

x_f 是滤波之后的函数 HD是使用的滤波器 fx是需要进行滤波的信号,例如:

%多音信号通过FIR带通
HD1 = FIR_BPF80_180;
Y1 = filter(HD1,y_m1357);
Y1F = fft(Y1,1000);
figure(4)
subplot(121);plot(abs(Y1F));title('多音信号通过FIR带通');
xlabel('frequency / hz')
ylabel('magnitude')
%多音信号通过FIR高通
HD2 = FIR_HPF800;
Y2 = filter(HD2,y_m1357);
Y2F = fft(Y2,1000);
subplot(122);plot(abs(Y2F));title('多音信号通过FIR高通');
xlabel('frequency / hz')
ylabel('magnitude')

%多音信号通过IIR带通
HD3 = IIR_BPF80_180;
Y3 = filter(HD3,y_m1357);
Y3F = fft(Y3,1000);
figure(5)
subplot(121);plot(abs(Y3F));title('多音信号通过IIR带通');
xlabel('frequency / hz')
ylabel('magnitude')
%多音信号通过IIR高通
HD4 = IIR_HPF800;
Y4 = filter(HD4,y_m1357);
Y4F = fft(Y4,1000);
subplot(122);plot(abs(Y4F));title('多音信号通过IIR高通');
xlabel('frequency / hz')
ylabel('magnitude')

%ASK通过IIR低通
HD5 = IIR_LPF600;
Y5 = filter(HD5,ASK);
Y5F = fft(Y5,1000);
figure(6)
subplot(121);plot(0:2:2000-1,20.*log10(abs(Y5F)/max(abs(Y5F))));title('2ASK通过IIR低通');
axis([0 1000 -80 1]);
xlabel('frequency / hz')
ylabel('magnitude / dB')
%ASK通过FIR低通
HD6 = FIR_LPF600;
Y6 = filter(HD6,ASK);
Y6F = fft(Y6,1000);
subplot(122);plot(0:2:2000-1,20.*log10(abs(Y6F)/max(abs(Y6F))));title('2ASK通过FIR低通');
axis([0 1000 -80 1]);
xlabel('frequency / hz')
ylabel('magnitude / dB')

%FSK通过IIR高通
HD7 = IIR_HPF800;
Y7 = filter(HD7,FSK);
Y7F = fft(Y7,1000);
figure(7)
subplot(121);plot(0:2:2000-1,20.*log10(abs(Y7F)/max(abs(Y7F))));title('2FSK通过IIR高通');
axis([0 1000 -80 1]);
xlabel('frequency / hz')
ylabel('magnitude / dB')
%ASK通过FIR高通
HD8 = FIR_HPF800;
Y8 = filter(HD8,FSK);
Y8F = fft(Y8,1000);
subplot(122);plot(0:2:2000-1,20.*log10(abs(Y8F)/max(abs(Y8F))));title('2FSK通过FIR高通');
axis([0 1000 -80 1]);
xlabel('frequency / hz')
ylabel('magnitude / dB')

每个信号所生成的频谱如下:
注:复制粘贴会因为没有滤波器模块而报错。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
尾记:
这是我初次接触Matlab软件 matlab软件是一个运算功能极其强大的软件,我是很后悔没有早接触到,以我的体会来说,他不是编程更多的是一种工具,用来模拟解决实际问题,我现在的水平还很低,希望自己能在matlab的使用上变得越来越好。
这篇博客如果有什么错误也恳请各位大佬指正。
今天是12.22日 2020的考研刚刚结束,明年就轮到我了,有时候真觉得时间飞逝,本来很早就想着准备考研,但是总是提不起劲来,新的一年要到了自己也该努力了,希望自己不要在明年战线中辜负自己。加油。

;