我用的matlab写fir滤波器程序,求补全画图的部分(要详细解释为什么这么写哈) 先谢啦

我用的matlab写fir滤波器程序,求补全画图的部分(要详细解释为什么这么写哈) 先谢啦,第1张

function xt=xtg(N)

%x(t)信号产生函数,并显示信号的幅频特性曲线

%xt=xtg 产生一个长度N,有加性高频噪声的单频调幅信号xt,采样频率Fs=1000Hz

%载波频率fc=Fs/10=100Hz,调制正弦波频率f0=fc/10=10Hz

N=2000Fs=1000T=1/FsTp=N*T

t=0:T:(N-1)*T

fc=Fs/10f0=fc/10 %载波频率fc=Fs/10,单频调制信号频率为f0=Fc/10

mt=cos(2*pi*f0*t) %产生单频正弦波调制信号mt,频率为f0

ct=cos(2*pi*fc*t) %产生载波正弦波信号ct,频率为f0

xt=mt.*ct%相乘产生单频调制信号xt

nt=2*rand(1,N)-1 %产生随机噪声nt

%-----------设计高通滤波器用于滤除噪声nt中的低频成分,生成高通噪声---------

fp=150fs=200Rp=0.1As=70 %滤波器指标

fb=[fp,fs]m=[0,1] %计算remezord函数所需参数f,m,dev

dev=[10^(-As/20),(10^(Rp/20)-1)/(10^(Rp/20)+1)]

[n,fo,mo,W]=remezord(fb,m,dev,Fs)%确定remez函数所需参数

hn=remez(n,fo,mo,W) %调用remez函数进行设计,滤除nt中的低频成分

yt=filter(hn,1,10*nt) %滤除低频噪声,生成高频噪声yt

%==================================================================

xt=xt+yt %噪声加信号

fst=fft(xt,N)k=0:N-1f=k/Tp

subplot(2,1,1)plot(t,xt)gridxlabel('t/s')ylabel('x(t)')

axis([0,Tp/5,min(xt),max(xt)])title('(a)信号加噪声波形')

subplot(2,1,2)plot(f,abs(fst)/max(abs(fst)))gridtitle('(b)信号加噪声频谱')

axis([0,Fs/2,0,1.2])xlabel('f/Hz')ylabel('幅度')

-----------------------------------------------------------------------

FIR滤波器实现

clear allclose all

%==调用xtg产生信号xt,xt长度N=1000,并显示xt及其频谱==========

N=1000xt=xtg(N)

fp=120fs=150Rp=0.2As=60Fs=1000 %输入给定指标

%用窗函数法

wc=(fp+fs)/Fs

B=2*pi*(fs-fp)/Fs

Nb=ceil(11*pi/B)

hn=fir1(Nb-1,wc,blackman(Nb))

ywt=fftfilt(hn,xt,N)

plot(。。。后面怎么写········求教

在图象处理的广泛应用领域中,傅立叶变换起着非常重要的作用,具体表现在包括图象分析、图象增强及图象压缩等方面。

fftshift的作用正是让正半轴部分和负半轴部分的图像分别关于各自的中心对称。因为直接用fft得出的数据与频率不是对应的,fftshift可以纠正过来。

假设f(x,y)是一个离散空间中的二维函数,则该函数的二维傅立叶变换的定义如下:

p=0,1…M-1 q=0,1…N-1 (1)

或 p=0,1…M-1 q=0,1…N-1 (2)

离散傅立叶反变换的定义如下:

m=0,1…M-1 n=0,1…N-1(3)

F(p,q)称为f(m,n)的离散傅立叶变换系数。这个式子表明,函数f(m,n)可以用无数个不同频率的复指数信号和表示,而在频率(w1,w2)处的复指数信号的幅度和相位是F(w1,w2)。

2、MATLAB提供的快速傅立叶变换函数

(1)fft2

fft2函数用于计算二维快速傅立叶变换,其语法格式为:

B = fft2(I)

B = fft2(I)返回图象I的二维fft变换矩阵,输入图象I和输出图象B大小相同。

例如,计算图象的二维傅立叶变换,并显示其幅值的结果,如图所示,其命令格式如下

load imdemos saturn2

imshow(saturn2)

B = fftshift(fft2(saturn2))

imshow(log(abs(B)),[],'notruesize')

(2)fftshift

MATLAB提供的fftshift函数用于将变换后的图象频谱中心从矩阵的原点移到矩阵的中心,其语法格式为:

B = fftshift(I)

对于矩阵I,B = fftshift(I)将I的一、三象限和二、四象限进行互换。

(2)ifft2

ifft2函数用于计算图象的二维傅立叶反变换,其语法格式为:

B = ifft2(I)

B = ifft2(A)返回图象I的二维傅立叶反变换矩阵,输入图象I和输出图象B大小相同。其语法格式含义与fft2函数的语法格式相同,可以参考fft2函数的说明。

如果信号是二维的,用上面的函数即可!直接调用。

如果信号是一维的,给你下面的例子,你应该能明白!

clear

fs=100N=128 %采样频率和数据点数

n=0:N-1t=n/fs %时间序列

x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t)%信号

y=fft(x,N) %对信号进行快速Fourier变换,逆变换函数为ifft

mag=abs(y)%求得Fourier变换后的振幅

f=n*fs/N %频率序列

subplot(2,2,1),plot(f,mag) %绘出随频率变化的振幅

xlabel('频率/Hz')

ylabel('振幅')title('N=128')grid on

subplot(2,2,2),plot(f(1:N/2),mag(1:N/2))%绘出Nyquist频率之前随频率变化的振幅

xlabel('频率/Hz')

ylabel('振幅')title('N=128')grid on

%对信号采样数据为1024点的处理

fs=100N=1024n=0:N-1t=n/fs

x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t)%信号

y=fft(x,N) %对信号进行快速Fourier变换

mag=abs(y) %求取Fourier变换的振幅

f=n*fs/N

subplot(2,2,3),plot(f,mag)%绘出随频率变化的振幅

xlabel('频率/Hz')

ylabel('振幅')title('N=1024')grid on

subplot(2,2,4)

plot(f(1:N/2),mag(1:N/2))%绘出Nyquist频率之前随频率变化的振幅

xlabel('频率/Hz')

ylabel('振幅')title('N=1024')grid on

FFT算法实现因为PIC16F877片内有高达368×8位(相当于184×16位)的数据存储器(RAM),故用片内RAM最多可以完成64点FFT(16位实部和虚部数据)。现在仅实现16点FFT,主要是起抛砖引玉的作用。这里的FFT是按频率抽取的。在调用FFT子程序前,输入数据按正常次序输入,而输出数据是经FFT变换整序处理后输出。原始数据被变换后的数据覆盖存放在RAM中,这是通过分解序列实现的;然而分解序列将引起DFT的项序混乱,所以在变换结束,所有的数据需要进行“整序”,以恢复DFT的正常次序。某些应用可以不进行整序;因而整序程序编成子程序形式,当需要时随时可以调用。输入数据为32位,前为16位实部,后为16位虚部,中间结果为32位;输出数据也是前为实部,后为虚部。这样计算的结果具有相当高的精度。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11306205.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-15
下一篇2023-05-15

发表评论

登录后才能评论

评论列表(0条)

    保存