实验七 用 MATLAB 设计 FIR 数字滤波器
实验目的
-
加深对窗函数法设计 FIR 数字滤波器的基本原理的理解。
-
学习用 Matlab 语言的窗函数法编写设计 FIR 数字滤波器的程序。
-
了解 Matlab 语言有关窗函数法设计 FIR 数字滤波器的常用函数用法。
-
掌握 FIR 滤波器的快速卷积实现原理。
-
不同滤波器的设计方法具有不同的优缺点,因此要全面、客观看待可能面对或出现的问题。
实验原理
用窗函数法设计FIR 数字滤波器
FIR数字滤波器的系统函数为
H ( z ) = ∑ n = 0 N − 1 h ( n ) z − n H(z)=\sum_{n=0}^{N-1} h(n) z^{-n} H(z)=n=0∑N−1h(n)z−n
这个公式也可以看成是离散 LSI 系统的系统函数
H ( z ) = Y ( z ) X ( z ) = b ( z ) a ( z ) = ∑ m = 0 M b m z − m 1 + ∑ k = 1 N a k z − k = b 0 + b 1 z − 1 + b 2 z − 2 + ⋯ + b m z − m 1 + a 1 z − 1 + a 2 z − 2 + ⋯ + a k z − k H(z)=\frac{Y(z)}{X(z)}=\frac{b(z)}{a(z)}=\frac{\sum_{m=0}^M b_m z^{-m}}{1+\sum_{k=1}^N a_k z^{-k}}=\frac{b_0+b_1 z^{-1}+b_2 z^{-2}+\cdots+b_m z^{-m}}{1+a_1 z^{-1}+a_2 z^{-2}+\cdots+a_k z^{-k}} H(z)=X(z)Y(z)=a(z)b(z)=1+∑k=1Nakz−k∑m=0Mbmz−m=1+a1z−1+a2z−2+⋯+akz−kb0+b1z−1+b2z−2+⋯+bmz−m
分母 a 0 a_0 a0 为 1, 其余 a k a_k ak 全都为 0时的一个特例。由于极点全部集中在零点, 稳定和线性相位特性是 FIR滤波器的突出优点, 因此在实际中广泛使用。
FIR 滤波器的设计任务是选择有限长度的 h ( n ) h(n) h(n), 使传输函数 H ( e j ω ) H\left(e^{j\omega}\right) H(ejω)满足技术要求。主要设计方法有窗函数法、频率采样法和切比雪夫等波纹逼近法等。本实验主要介绍窗函数法。
用窗函数法设计 FIR 数字滤波器的基本步骤如下:
(1) 根据过渡带和阻带衰减指标选择窗函数的类型, 估算滤波器的阶数 N N N。
(2) 由数字滤波器的理想频率响应 H ( e j ω ) H\left(e^{j\omega}\right) H(ejω)求出其单位冲激响应 h d ( n ) h_{d}(n) hd(n)。 可用自定义函数 ideal_lp \text{ideal\_lp} ideal_lp实现理想数字低通滤波器频率响应的求解。程序清单如下:
function hd = ideal_lp(wc, N) % 点 0 到 N-1 之间的理想脉冲响应% wc = 截止频率 (弧度)% N = 理想滤波器的长度tao = (N-1)/2;n = [0:(N-1)];m = n - tao + eps; % 加一个小数以避免 0 作除数hd = sin(wc * m) ./ (pi * m);
end
其它选频滤波器可以由低通频响特性合成。如一个通带在 ω c 1 ∼ ω c 2 \omega_{c1} \sim \omega_{c2} ωc1∼ωc2 之间的带通滤波器在给定 N N N值的条件下,可以用下列程序实现:
Hd = ideal_lp(wc2, N) - ideal_lp(wc1, N);
(3) 计算数字滤波器的单位冲激响应 h ( n ) = w ( n ) h d ( n ) h(n) = w(n)hd(n) h(n)=w(n)hd(n)。
(4) 检查设计的滤波器是否满足技术指标。
如果设计的滤波器不满足技术指标,则需要重新选择或调整窗函数的类型,估算滤波器的阶数 N N N。再重复前面的四个步骤,直到满足指标。
常用的窗函数有矩形窗、三角形窗、汉宁窗、哈明窗、切比雪夫窗、布莱克曼窗、凯塞窗等,Matlab均有相应的函数可以调用。另外,MATLAB 信号处理工具箱还提供了 'firl’函数,可以用于窗函数法设计 FIR 滤波器。
由于第一类线性相位滤波器 (类型 I)能进行低通、高通、带通、带阻滤波器的设计,因此,本实验所有滤波器均采用第一类线性相位滤波器。
各种窗函数特性的比较
窗函数 | 旁瓣峰值/dB | 近似过渡带宽 | 精确过渡带宽 | 阻带最小衰减/dB |
---|---|---|---|---|
矩形窗 | -13 | 4 π / N 4\pi/N 4π/N | 1.8 π / N 1.8\pi/N 1.8π/N | 21 |
三角形窗 | -25 | 8 π / N 8\pi/N 8π/N | 6.1 π / N 6.1\pi/N 6.1π/N | 25 |
汉宁窗 | -31 | 8 π / N 8\pi/N 8π/N | 6.2 π / N 6.2\pi/N 6.2π/N | 44 |
哈明窗 | -41 | 8 π / N 8\pi/N 8π/N | 6.6 π / N 6.6\pi/N 6.6π/N | 53 |
布莱克曼窗 | -57 | 12 π / N 12\pi/N 12π/N | 11 π / N 11\pi/N 11π/N | 74 |
凯塞窗 | -57 | 无 | 10 π / N 10\pi/N 10π/N | 80 |
信号的整数倍零值内插
设 x ( n ) x(n) x(n) 是连续信号 x a ( t ) x_a(t) xa(t) 的采样序列,其采样频率为 f 1 = 1 T 1 ( Hz ) , T 1 f_1 = \frac{1}{T_1} (\text{Hz}), T_1 f1=T11(Hz),T1是采样间隔。如果将其采样频率降低到原来的 1 D \frac{1}{D} D1( D D D 为大于 1的整数,称为抽取因子),最简单的方法是对 x ( n ) x(n) x(n) 每 D − 1 D-1 D−1 个点抽取 1点,组成一个新的序列 y ( n ) y(n) y(n)。由于 y ( n ) y(n) y(n) 的采样间隔 T 2 = D T 1 T_2 = DT_1 T2=DT1,除非抽取后仍能满足采样定理,否则会引起频谱混叠现象。信号抽取前后的频谱关系见教材第8 章的 8.2节。为了避免抽取后的频率混叠,在抽取前先采用一个抗混叠低通滤波器对信号滤波,把信号的频带限制在某个频率以下。
抗混叠滤波器的系统函数为:
H ( e j ω ) = { 1 ∣ ω ∣ < π D 0 π D ≤ ∣ ω ∣ ≤ π H(e^{j\omega}) = \begin{cases} 1 & |\omega| < \frac{\pi}{D} \\ 0 & \frac{\pi}{D} \leq |\omega| \leq \pi \end{cases} H(ejω)={10∣ω∣<DπDπ≤∣ω∣≤π
例题
例2-2 选择合适的窗函数设计一个FIR 数字低通滤波器
要求:通带截止频率为ωp=0.3 π ,Rp=0.05dB;阻带截止频率为ωs=0.45 π ,As=50dB。描绘该滤波器的脉冲响应、窗函数及滤波器的幅频响应曲线和相频响应曲线。分析:根据设计指标要求,并查表2-1,选择哈明窗。程序清单如下:
addpath('.\2024-2025(1)《信号处理实验》资料(请拷贝到u盘中,每次试验带到实验室)\实验中用到的一些函数和音频图像文件');
wp = 0.3*pi;
ws = 0.45*pi;
deltaw = ws - wp;
N0 = ceil(6.6*pi/deltaw);N = N0 + mod(N0 + 1, 2); % 为实现 FIR 类型 1 偶对称滤波器,应确保 N 为奇数
windows = (hamming(N))';
wc = (ws + wp) / 2;hd = ideal_lp(wc, N);
b = hd .* windows;[H, w] = freqz(b, 1, 1000, 'whole');
H = (H(1:501))';
w = (w(1:501))';mag = abs(H);
db = 20 * log10((mag + eps) / max(mag));pha = angle(H);
n = 0:N-1;
dw = 2 * pi / 1000;Rp = -(min(db(1:wp/dw + 1))); % 检验通带波动
As = -round(max(db(ws/dw + 1:501))); % 检验最小阻带衰减subplot(2, 2, 1);
stem(n, b);
axis([0, N, 1.1 * min(b), 1.1 * max(b)]);
title('实际脉冲响应');
xlabel('n');
ylabel('h(n)');subplot(2, 2, 2);
stem(n, windows);
axis([0, N, 0, 1.1]);
title('窗函数特性');
xlabel('n');
ylabel('wd(n)');subplot(2, 2, 3);
plot(w/pi, db);
axis([0, 1, -80, 10]);
title('幅度频率响应');
xlabel('频率(单位:\pi)');
ylabel('H(e^{j\omega})');
set(gca, 'XTickMode', 'manual', 'XTick', [0, wp/pi, ws/pi, 1]);
set(gca, 'YTickMode', 'manual', 'YTick', [-50, -20, -3, 0]);
grid on;subplot(2, 2, 4);
plot(w/pi, pha);
axis([0, 1, -4, 4]);
title('相位频率响应');
xlabel('频率(单位:\pi)');
ylabel('\phi(\omega)');set(gca, 'XTickMode', 'manual', 'XTick', [0, wp/pi, ws/pi, 1]);
set(gca, 'YTickMode', 'manual', 'YTick', [-3.1416, 0, 3.1416, 4]);
grid on;

例2-3 用Matlab 信号处理工具箱的fir1 函数设计一个FIR 数字低通滤波器
要求:通带截止频率为ωp=0.3 π ,Rp=0.05dB;阻带截止频率为ωs=0.45 π ,As=50dB。
close;clear;wp = 0.3*pi;
ws = 0.45*pi;
deltaw = ws - wp;
N0 = ceil(6.6*pi/deltaw);
N = N0 + mod(N0 + 1, 2); % 为实现 FIR 类型 1 偶对称滤波器,应确保 N 为奇数
windows = hamming(N); % 使用哈明窗,此句可省略
wc = (ws + wp) / 2 / pi; % 截止频率取归一化通阻带频率的平均值
b = fir1(N-1, wc, windows); % 用 fir1 函数求系统函数系数,windows 可省略[H, w] = freqz(b, 1, 1000, 'whole');
H = (H(1:501))';
w = (w(1:501))';mag = abs(H);
db = 20*log10((mag + eps) / max(mag));
pha = angle(H);n = 0:N-1;
dw = 2*pi/1000;Rp = -(min(db(1:wp/dw + 1))); % 检验通带波动
As = -round(max(db(ws/dw + 1:501))); % 检验最小阻带衰减draw(n,b,N,windows,w,db,wp,ws,pha,As);

实验内容
1、阅读并输入实验原理中介绍的例题程序,观察输出的数据和图形,结合基本原理理解每一条语句的含义。
2、选择合适的窗函数设计FIR 数字低通滤波器

要求:ωp=0.24 π ,Rp=0.1dB;ωs=0.3 π ,As=60dB。描绘该滤波器的脉冲响应、窗函数及滤波器的幅频响应曲线和相频响应曲线。
close;clear;
As=60;
wp = 0.24*pi;
ws = 0.3*pi;
deltaw = ws - wp;
N0 = ceil(11*pi/deltaw);
N = N0 + mod(N0 + 1, 2); % 为实现 FIR 类型 1 偶对称滤波器,应确保 N 为奇数
windows = blackman(N); % 使用布莱克曼窗
wc = (ws + wp) / 2 / pi; % 截止频率取归一化通阻带频率的平均值
b = fir1(N-1, wc, windows); % 用 fir1 函数求系统函数系数,windows 可省略[H, w] = freqz(b, 1, 1000, 'whole');
H = (H(1:501))';
w = (w(1:501))';mag = abs(H);
db = 20*log10((mag + eps) / max(mag));
pha = angle(H);n = 0:N-1;
dw = 2*pi/1000;% Rp = -(min(db(1:wp/dw + 1))); % 检验通带波动
% As = -round(max(db(ws/dw + 1:501))); % 检验最小阻带衰减draw(n,b,N,windows,w,db,wp,ws,pha,As);

3、调用信号产生函数xtg 产生具有加性噪声的信号x(t),并显示信号及其频谱。
addpath('.\2024-2025(1)《信号处理实验》资料(请拷贝到u盘中,每次试验带到实验室)\实验中用到的一些函数和音频图像文件');
[xt,tf]=xtg(1000);

4、采用实验内容步骤2 中设计的FIR 数字低通滤波器
调用Matlab 快速卷积函数fftfilt 实现对x(t)的滤波,从高频噪声中提取x(t)中的单频调幅信号。绘图显示滤波器的频率响应特性曲线、滤波器输出信号的幅频特性图和时域波形图。
yt = fftfilt(b, xt);Hyk = abs(fft(yt));
figure;subplot(2, 1, 1);
plot(tf, yt);
axis([0, 1, -2, 2]);subplot(2, 1, 2);
stem(Hyk);axis([80, 120, min(Hyk), max(Hyk)]);

5、 选做题 ,读取音频信号 motherland.wav,得到 xn
1 对 xn进行 I=2的整数倍 0值内插,得到音频信号 yn1
2 设计一个 镜像 低通滤波器(可在实验内容 2的代码上进行修改)
3 对 yn1进行 滤波,得到音频信号 yn2。
①音频播放: 依次播放 原音频 信号 xn、 yn1和 yn2,体验 整数倍 0值内插后的 音质。
close;clear;
[xn,fs]=audioread('motherland.wav');% 读取音频信号
% sound(xn,fs); % 播放音频信号,
% pause(length(xn)/fs); % 暂停执行程序 length(xn)/fs秒,确保音频播 放完。
I=2; % 实现 I=2的整数倍 0值内插
for i=1:length(xn);
yn1(I*i-1)=xn(i);
yn1(I*i)= 0;
end
% sound(yn1,I*fs); %采样频率变大了,为 I*fs
②取原音频某段信号,如 n=8000~8199 。画出该段信号模拟域幅度谱(横坐标为 f Hz );画出该段信号 I=2 内插后的模拟域幅度谱;画出该段信号内插后再经过镜像滤波后的模拟域幅度谱。
addpath('.\2024-2025(1)《信号处理实验》资料(请拷贝到u盘中,每次试验带到实验室)\实验中用到的一些函数和音频图像文件');
wp = 0.48*pi;
ws = 0.52*pi;
deltaw = ws - wp;
N0 = ceil(6.6*pi/deltaw);
N = N0 + mod(N0 + 1, 2); % 为实现 FIR 类型 1 偶对称滤波器,应确保 N 为奇数
windows = (hamming(N))';
wc = (ws + wp) / 2;hd = ideal_lp(wc, N);
b = hd .* windows;
b
b = 1x165 0.0000 0.0003 -0.0000 -0.0003 0.0000 0.0004 -0.0000 -0.0004 0.0000 0.0005 -0.0000 -0.0005 0.0000 0.0006 0.0000 -0.0007 0.0000 0.0009 -0.0000 -0.0010 0.0000 0.0012 -0.0000 -0.0013 -0.0000 0.0015 -0.0000 -0.0018 0.0000 0.0020 0.0000 -0.0023 -0.0000 0.0026 -0.0000 -0.0029 0.0000 0.0033 -0.0000 -0.0037 -0.0000 0.0042 -0.0000 -0.0047 0.0000 0.0052 -0.0000 -0.0059 -0.0000 0.0065
[H, w] = freqz(b, 1, 1000, 'whole');
H = (H(1:501))';
w = (w(1:501))';mag = abs(H);
db = 20 * log10((mag + eps) / max(mag));pha = angle(H);
n = 0:N-1;
dw = 2 * pi / 1000;
N=2048;
Xn=1/fs*fft(xn(8000:8199),N); % 从 xn中取 200点做谱分析, N可取 2048
plot((0:N/2-1)*fs/N,abs(Xn(1:N/2)));% 模拟域幅度谱

Yn1=1/(I*fs)*fft(yn1(16000:16399),N); % 内插后,200点长变成了400点长
plot((0:N/2-1)*I*fs/N,abs(Yn1(1:N/2)));

yn2=filter(b,1,yn1); % 对yn1进行滤波,b为所设计的镜像滤波器
Yn2=1/(I*fs)*fft(yn2(16000:16399),N); % 内插后,200点长变成了400点长
plot((0:N/2-1)*I*fs/N,abs(Yn2(1:N/2)));

思考题
根据下面指标要求设计四种不同类型的FIR 线性相位数字滤波器,要求画出h(n),幅频特性曲线、幅频衰减特性曲线,相频特性曲线,标注相关信息,包括横坐标,纵坐标的单位,曲线名称。
close;clear;wp = 0.2*pi;
ws = 0.3*pi;
deltaw = ws - wp;
N0 = ceil(6.1*pi/deltaw);
N = N0 + mod(N0 + 1, 2); % 为实现 FIR 类型 1 偶对称滤波器,应确保 N 为奇数
windows = triang(N); % 使用哈明窗,此句可省略
wc = (ws + wp) / 2 / pi; % 截止频率取归一化通阻带频率的平均值
b = fir1(N-1, wc, windows); % 用 fir1 函数求系统函数系数,windows 可省略
[H, w] = freqz(b, 1, 1000, 'whole');
H = (H(1:501))';
w = (w(1:501))';mag = abs(H);
db = 20*log10((mag + eps) / max(mag));
pha = angle(H);n = 0:N-1;
dw = 2*pi/1000;Rp = -(min(db(1:wp/dw + 1))); % 检验通带波动
As = -round(max(db(ws/dw + 1:501))); % 检验最小阻带衰减draw2(n,b,N,w,db,wp,ws,mag,pha,As);

close;clear;wp = 0.6*pi;
ws = 0.4*pi;
deltaw = wp - ws;
N0 = ceil(6.2*pi/deltaw);
N = N0 + mod(N0 + 1, 2); % 为实现 FIR 类型 1 偶对称滤波器,应确保 N 为奇数
windows = hanning(N); % 使用哈明窗,此句可省略
wc = (ws + wp) / 2 / pi; % 截止频率取归一化通阻带频率的平均值
b = fir1(N-1, wc,'high', windows); % 用 fir1 函数求系统函数系数,windows 可省略[H, w] = freqz(b, 1, 1000, 'whole');
H = (H(1:501))';
w = (w(1:501))';mag = abs(H);
db = 20*log10((mag + eps) / max(mag));
pha = angle(H);n = 0:N-1;
dw = 2*pi/1000;Rp = -(min(db(1:wp/dw + 1))); % 检验通带波动
% As = -round(max(db(ws/dw + 1:501))); % 检验最小阻带衰减
As=43;
draw2(n,b,N,w,db,wp,ws,mag,pha,As);

close;clear;wp = [0.2,0.6]*pi;
ws = [0.15,0.65]*pi;
deltaw = wp - ws;
N0 = ceil(6.6*pi./deltaw);
N = max(N0 + mod(N0 + 1, 2)); % 为实现 FIR 类型 1 偶对称滤波器,应确保 N 为奇数
windows = hamming(N); % 使用哈明窗,此句可省略
wc = (ws + wp) / 2 / pi; % 截止频率取归一化通阻带频率的平均值
b = fir1(N-1, wc,'bandpass'); % 用 fir1 函数求系统函数系数,windows 可省略[H, w] = freqz(b, 1, 1000, 'whole');
H = (H(1:501))';
w = (w(1:501))';mag = abs(H);
db = 20*log10((mag + eps) / max(mag));
pha = angle(H);
nextfigure
n = 0:N-1;
dw = 2*pi/1000;Rp = -(min(db(1:wp/dw + 1))); % 检验通带波动
% As = -round(max(db(ws/dw + 1:501))); % 检验最小阻带衰减
As=50;
draw3(n,b,N,w,db,wp,ws,mag,pha,As);

close;clear;wp = [0.2,0.6]*pi;
ws = [0.15,0.65]*pi;
deltaw = wp - ws;
N0 = ceil(6.6*pi./deltaw);
N = max(N0 + mod(N0 + 1, 2)); % 为实现 FIR 类型 1 偶对称滤波器,应确保 N 为奇数
windows = hamming(N); % 使用哈明窗,此句可省略
wc = (ws + wp) / 2 / pi; % 截止频率取归一化通阻带频率的平均值
b = fir1(N-1, wc,'stop'); % 用 fir1 函数求系统函数系数,windows 可省略[H, w] = freqz(b, 1, 1000, 'whole');
H = (H(1:501))';
w = (w(1:501))';mag = abs(H);
db = 20*log10((mag + eps) / max(mag));
pha = angle(H);n = 0:N-1;
dw = 2*pi/1000;Rp = -(min(db(1:wp/dw + 1))); % 检验通带波动
% As = -round(max(db(ws/dw + 1:501))); % 检验最小阻带衰减
As=45;
draw3(n,b,N,w,db,wp,ws,mag,pha,As);

绘图函数
用到的绘图函数,可以以.m文件保存,放在同一路径下。或addpath加入函数的绝对/相对路径。
% function draw(n,b,N,windows,w,db,wp,ws,pha,As)
% subplot(2, 2, 1);
% stem(n, b);
% axis([0, N, 1.1 * min(b), 1.1 * max(b)]);
% title('实际脉冲响应');
% xlabel('n');
% ylabel('h(n)');
%
% subplot(2, 2, 2);
% stem(n, windows);
% axis([0, N, 0, 1.1]);
% title('窗函数特性');
% xlabel('n');
% ylabel('wd(n)');
%
% subplot(2, 2, 3);
% plot(w/pi, db);
% axis([0, 1, -80, 10]);
% title('幅度频率响应');
% xlabel('频率(单位:\pi)');
% ylabel('H(e^{j\omega})');
% set(gca, 'XTickMode', 'manual', 'XTick', [0, wp/pi, ws/pi, 1]);
% set(gca, 'YTickMode', 'manual', 'YTick', [-As, -20, -3, 0]);
% grid on;
%
% subplot(2, 2, 4);
% plot(w/pi, pha);
% axis([0, 1, -4, 4]);
% title('相位频率响应');
% xlabel('频率(单位:\pi)');
% ylabel('\phi(\omega)');
%
% set(gca, 'XTickMode', 'manual', 'XTick', [0, wp/pi, ws/pi, 1]);
% set(gca, 'YTickMode', 'manual', 'YTick', [-3.1416, 0, 3.1416, 4]);
% grid on;
% function draw2(n,b,N,w,db,wp,ws,mag,pha,As)
% subplot(2, 2, 1);
% stem(n, b);
% axis([0, N, 1.1 * min(b), 1.1 * max(b)]);
% title('实际脉冲响应');
% xlabel('n');
% ylabel('h(n)');
%
% subplot(2, 2, 2);
% plot(w/pi, mag);
% xlabel('频率(单位:\pi)');
% ylabel('|H|');
% title('幅频特性曲线');
% axis([0, 1, 0, 1.1]);
% set(gca, 'XTickMode', 'manual', 'XTick', [0, min([wp/pi,ws/pi]), max([wp/pi,ws/pi]), 1]);
% set(gca, 'YTickMode', 'manual', 'YTick', [0, 0.707, 1]);
% grid on;
%
% subplot(2, 2, 3);
% plot(w/pi, db);
% axis([0, 1, -80, 10]);
% title('幅频衰减特性曲线');
% xlabel('频率(单位:\pi)');
% ylabel('H(e^{j\omega})');
% set(gca, 'XTickMode', 'manual', 'XTick', [0, min([wp/pi,ws/pi]), max([wp/pi,ws/pi]), 1]);
% set(gca, 'YTickMode', 'manual', 'YTick', [min([-As,-20]), max([-As,-20]), -3, 0]);
% grid on;
%
% subplot(2, 2, 4);
% plot(w/pi, pha);
% axis([0, 1, -4, 4]);
% title('相频特性曲线');
% xlabel('频率(单位:\pi)');
% ylabel('\phi(\omega)');
%
% set(gca, 'XTickMode', 'manual', 'XTick', [0, min([wp/pi,ws/pi]), max([wp/pi,ws/pi]), 1]);
% set(gca, 'YTickMode', 'manual', 'YTick', [-3.1416, 0, 3.1416, 4]);
% grid on;
% function draw3(n,b,N,w,db,wp,ws,mag,pha,As)
% unique_ticks = unique([0, wp/pi, ws/pi, 1]);
% subplot(2, 2, 1);
% stem(n, b);
% axis([0, N, 1.1 * min(b), 1.1 * max(b)]);
% title('实际脉冲响应');
% xlabel('n');
% ylabel('h(n)');
%
% subplot(2, 2, 2);
% plot(w/pi, mag);
% xlabel('频率(单位:\pi)');
% ylabel('|H|');
% title('幅频特性曲线');
% axis([0, 1, 0, 1.1]);
% set(gca, 'XTickMode', 'manual', 'XTick', unique_ticks);
% set(gca, 'YTickMode', 'manual', 'YTick', [0, 0.707, 1]);
% grid on;
%
% subplot(2, 2, 3);
% plot(w/pi, db);
% axis([0, 1, -80, 10]);
% title('幅频衰减特性曲线');
% xlabel('频率(单位:\pi)');
% ylabel('H(e^{j\omega})');
% set(gca, 'XTickMode', 'manual', 'XTick', unique_ticks);
% set(gca, 'YTickMode', 'manual', 'YTick', [min([-As,-20]), max([-As,-20]), -3, 0]);
% grid on;
%
% subplot(2, 2, 4);
% plot(w/pi, pha);
% axis([0, 1, -4, 4]);
% title('相频特性曲线');
% xlabel('频率(单位:\pi)');
% ylabel('\phi(\omega)');
%
% set(gca, 'XTickMode', 'manual', 'XTick', unique_ticks);
% set(gca, 'YTickMode', 'manual', 'YTick', [-3.1416, 0, 3.1416, 4]);
% grid on;
相关文章:
实验七 用 MATLAB 设计 FIR 数字滤波器
实验目的 加深对窗函数法设计 FIR 数字滤波器的基本原理的理解。 学习用 Matlab 语言的窗函数法编写设计 FIR 数字滤波器的程序。 了解 Matlab 语言有关窗函数法设计 FIR 数字滤波器的常用函数用法。 掌握 FIR 滤波器的快速卷积实现原理。 不同滤波器的设计方法具有不同的优…...
Linux - selinux
七、selinux 1、说明 SELinux是Security-Enhanced Linux的缩写,意思是安全强化的linux。 SELinux是对程序、文件等权限设置依据的一个内核模块。由于启动网络服务的也是程序,因此刚好也 是能够控制网络服务能否访问系统资源的一道关卡。 传统的文件权…...
【STL】C++ vector类模板
文章目录 基本概念vector的使用定义和初始化构造函数赋值操作容量和大小插入和删除数据存取 互换容器vector的迭代器vector储存自定义数据类型 基本概念 vector是类型相同的对象的容器,vector的大小可以变化,可以向数组中增加元素。因此,vec…...
物联网——WatchDog(监听器)
看门狗简介 独立看门狗框图 看门狗原理:定时器溢出,产生系统复位信号;若定时‘喂狗’则不产生系统复位信号 定时中断基本结构(对比) IWDG键寄存器 独立看门狗超时时间 WWDG(窗口看门狗) WWDG特性 WWDG超时时间 由于…...
从零开始写游戏之斗地主-网络通信
在确定了数据结构后,原本是打算直接开始写斗地主的游戏运行逻辑的。但是突然想到我本地写出来之后,也测试不了啊,所以还是先写通信模块了。 基本框架 在Java语言中搞网络通信,那么就得请出Netty这个老演员了。 主要分为两个端&…...
【智能控制】实验,基于MATLAB的模糊推理系统设计,模糊控制系统设计
关注作者了解更多 我的其他CSDN专栏 过程控制系统 工程测试技术 虚拟仪器技术 可编程控制器 工业现场总线 数字图像处理 智能控制 传感器技术 嵌入式系统 复变函数与积分变换 单片机原理 线性代数 大学物理 热工与工程流体力学 数字信号处理 光电融合集成电路…...
Vega Editor 基于 Web 的图形编辑器
Vega Editor 是一个强大的基于 Web 的图形编辑器,专为 Vega 和 Vega-Lite 可视化语法设计。它提供了一个交互式的环境,用户可以在其中编写、预览和分享他们的 Vega 和 Vega-Lite 可视化作品。Vega 和 Vega-Lite 是用于声明性可视化的开源语法,…...
SQL 中SET @variable的使用
在 SQL 中,SET variable 用于声明和赋值用户定义的变量。具体来说, 符号用于表示一个局部变量,可以在 SQL 语句中存储和使用。它通常在存储过程、函数或简单的 SQL 查询中使用。 1. 声明并赋值给变量 你可以使用 SET 语句给一个变量赋值。例…...
基于 Vite 封装工具库实践
项目背景:公司在多个项目中频繁使用相同的工具函数。为了避免每次开发新项目时都重复复制代码,决定通过 Vite 封装一个时间函数组件库。该库将被发布到 Verdaccio 供团队其他项目使用。 项目介绍 本项目封装了一个时间函数工具库,使用 Momen…...
Oracle DataGuard 主备正常切换 (Switchover)
前言 众所周知,DataGuard 的切换分为两种情况: 系统正常情况下的切换:这种方式称为 switchover,是无损切换,不会丢失数据。灾难情况下的切换:这种情况下一般主库已经启动不起来了,称为 failov…...
[Redis#13] cpp-redis接口 | set | hash |zset
目录 Set 1. Sadd 和 Smembers 2. Sismember 3. Scard 4. Spop 5. Sinter 6. Sinter store Hash 1. Hset 和 Hget 2. Hexists 3. Hdel 4. Hkeys 和 Hvals 5. Hmget 和 Hmset Zset 1. Zadd 和 Zrange 2. Zcard 3. Zrem 4. Zscore cpp-redis 的学习 主要关注于…...
青海摇摇了3天,技术退步明显.......
最近快手上的青海摇招聘活动非常火热,我已经在思考是否备战张诗尧的秋招活动。开个玩笑正片开始: 先说一下自己的情况,大专生,20年通过校招进入杭州某软件公司,干了接近4年的功能测试,今年年初,…...
Flask+Minio实现断点续传技术教程
什么是MinIO MinIO是一个高性能的分布式对象存储服务,与Amazon S3 API兼容。它允许用户存储和检索任意规模的数据,非常适合于使用S3 API的应用程序。MinIO支持多租户存储,提供高可用性、高扩展性、强一致性和数据持久性。它还可以作为软件定义…...
Java中Logger定义的三种方式
在 Java 项目中,日志记录是开发中的一个重要部分,用于跟踪系统运行状态、排查问题以及记录重要事件。在定义日志记录器时,经常会遇到一些写法上的选择,比如 Logger 的作用域、是否使用静态变量,以及如何命名变量。本篇…...
模型压缩技术
目录 模型压缩技术 权重剪枝: 量化技术: 知识蒸馏: 低秩分解: 一、权重剪枝 二、量化技术 三、知识蒸馏 四、低秩分解 模型压缩技术 权重剪枝: 描述:通过删除模型中不重要的权重来减少参数数量和计算量。举例说明:假设我们有一个神经网络模型,其中某些神经元的…...
面试题整理
1 spring使用中有哪些设计模式 工厂模式-beanFactory,代理模式-aop,单例模式-每个bean默认都是单例的,原型模式-当将bean的作用域改为prototype时每次获取bean时使用了原型模式创建对象,责任链模式-dispatchServle查找url对应的处理器映射器时使用了,观察者模式-spring的…...
Linux
1、显示系统中所有进程 ps -ef运行效果: [rootredhat-9 ~]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 19:01 ? 00:00:01 /usr/lib/systemd/systemd rhgb --switched-r root 2 0 0…...
力扣_2389. 和有限的最长子序列
力扣_2389. 和有限的最长子序列 给你一个长度为 n 的整数数组 nums ,和一个长度为 m 的整数数组 queries 。 返回一个长度为 m 的数组 answer ,其中 answer[i] 是 nums 中 元素之和小于等于 queries[i] 的 子序列 的 最大 长度 。 子序列 是由一个数组…...
UI设计从入门到进阶,全能实战课
课程内容: ├── 【宣导片】从入门到进阶!你的第一门UI必修课!.mp4 ├── 第0课:UI知识体系梳理 学习路径.mp4 ├── 第1课:IOS设计规范——基础规范与切图.mp4 ├── 第2课:IOS新趋势解析——模块规范与设计原则(上).mp4…...
Formality:等价性检查的流程与模式(Guide、Setup、Preverify、Match与Verify)
相关阅读 Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482 等价性检查的流程 图1概述了使用Formality进行等效性检查的具体步骤。 图1 等价性检查流程 启动Formality(Start Formality) 要启动Formality,请…...
【Linux】————(日志、线程池及死锁问题)
作者主页: 作者主页 本篇博客专栏:Linux 创作时间 :2024年11月29日 日志 关于日志,首先我们来说一下日志的作用, 作用: 问题追踪:通过日志不仅仅包括我们程序的一些bug,也可以在…...
【自动化】配置信息抽取
公共基本信息配置文件抽取 公共基本信息比如卖家、买家、管理员,验证码等基本信息,再比如数据库、redis、各个服务的域名,这些目前是写死在代码之中的,为了能够更好的维护他们,我们将他们放入配置文件进行管理 公共的…...
Python毕业设计选题:基于django+vue的校园影院售票系统
开发语言:Python框架:djangoPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 管理员登录 管理员功能界面 用户管理 影院信息管理 电影类型管理 电影信息管理 系统…...
Docker化部署Flask:轻量级Web应用的快速部署方案
Flask是一个用Python编写的轻量级Web应用框架,以其简洁性和灵活性而受到开发者的喜爱。Docker作为一种流行的容器化技术,为应用的部署和管理提供了极大的便利。本文将探讨Flask的优点、Docker部署的好处,并详细介绍如何将Flask应用Docker化部…...
centos怎么通过docker安装一个gitlab
在CentOS上通过Docker安装GitLab的步骤如下: 安装Docker引擎: 首先,需要在你的CentOS系统上安装Docker。可以通过以下命令来安装Docker:yum install -y yum-utils yum-config-manager --add-repo https://download.docker.com/lin…...
docker 运行my-redis命令
CREATE TABLE orders ( order_id bigint NOT NULL COMMENT "订单ID", dt date NOT NULL COMMENT "日期", merchant_id int NOT NULL COMMENT "商家ID", user_id int NOT NULL COMMENT "用户ID", good_id int NOT NULL COMMENT "商…...
qt6.4.0+visual studio2022+opencv
qt6.4.0visual studio2022opencv 补充:在安装完Qt后还需要配置环境变量...
23种设计模式之适配器模式
目录 1. 简介1.1 定义1.2 结构和组成部分 2. 代码2.1 MediaPlayer2.2 AdvanceMediaPlayer2.3 VicPlayer2.4 Mp4Player2.5 MediaPlayerAdapter2.6 AudioPlayer2.7 Test 3. 适用场景4. 优点和缺点5. 总结 1. 简介 1.1 定义 适配器模式(Adapter Pattern)是…...
剖析go协程池实现原理
go协程池实现 在go语言编程中有一种池肯定避免不了,那就是-协程池,无论你是日常工作还是面试中面试官都无法避免协程池,掌握协程池你也就算是入门go的并发编程了,打一波广告后面会有专门的文章来介绍如何在go中进行并发编程。 协…...
渗透测试--Linux上获取凭证
在测试过程中我们也会发现一些Linux主机加域的情况,虽然不多见,但它确实存在。正所谓技多不压身,这样能够触类旁通的知识,我们怎能错过,所以在此我们将会主要探讨从Linux主机上获取域凭证的方法。主要有以下内容&#…...
【笔记】自动驾驶预测与决策规划_Part9_数据驱动前沿算法与发展趋势
文章目录 数据驱动前沿算法与发展趋势0. 前言1. 端到端自动驾驶引言2. 端到端自动驾驶2.1 端到端自动驾驶早期尝试 ALVINN2.2 基于模仿学习的端到端系统 NVIDIA-E2E2.3 基于强化学习的端到端系统2.4 多模态融合的自动驾驶 Transfuser2.5 模块化端到端 UniAD2.6 模块化端到端 VA…...
工业公辅车间数智化节能头部企业,蘑菇物联选择 TDengine 升级 AI 云智控
小T导读:在工业节能和智能化转型的浪潮中,蘑菇物联凭借其自研的灵知 AI 大模型走在行业前沿,为高能耗设备和公辅能源车间提供先进的 AI 解决方案。此次采访聚焦于蘑菇物联与 TDengine 的合作项目,通过 AI 云智控平台的建设&#x…...
【Linux】开启你的Linux之旅:初学者指令指南
Linux相关知识点可以通过点击以下链接进行学习一起加油! 在 Linux 开发中,GDB 调试器和 Git 版本控制工具是开发者必备的利器。GDB 帮助快速定位代码问题,Git 则提供高效的版本管理与协作支持。本指南将简明介绍两者的核心功能与使用技巧&…...
Vite 6.0 发布:引领现代前端开发新方向
Vite 6.0 带来了大量更新与优化,旨在简化开发流程、提升性能,并解决现代 Web 开发中的诸多挑战。本次更新引入了 实验性环境 API 和现代化的工具链,进一步巩固了 Vite 作为开发者首选工具的地位。以下是关于新特性、生态发展以及重要更新的全…...
深入了解阿里云 OSS:强大的云存储解决方案
在现代互联网应用中,数据存储是一个不可忽视的环节。随着数据量的不断增长,传统的存储方式已经无法满足高速、低成本、大容量的需求。阿里云 OSS(对象存储服务)作为一种高性能、低成本且具备高度扩展性的云存储服务,已…...
canvas绘制网络地址图片
canvas在绘制网络地址图片时,需要先下载成临时路径 export function downLoadBgImg (url) {return new Promise((r,j) > {uni.downloadFile({url,success : res > {if (res.statusCode 200) {r(res.tempFilePath);return;};j(依赖文件下载失败);},fail : er…...
《DSL-FIQA》论文翻译
《DSL-FIQA: Assessing Facial Image Quality Via Dual-Set Degradation Learning and Landmark-Guided Transformer》 原文链接:DSL-FIQA: Assessing Facial Image Quality via Dual-Set Degradation Learning and Landmark-Guided Transformer | IEEE Conference…...
【Linux网络编程】第四弹---构建UDP服务器与字典翻译系统:源码结构与关键组件解析
✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【Linux网络编程】 目录 1、UdpServer.hpp 1.1、函数对象声明 1.2、Server类基本结构 1.3、构造函数 1.4、Start() 2、Dict.hpp…...
【人工智能】人工智能,深度学习与人工神经网络
人工智能 人工智能一、定义与核心要素二、主要方法与技术三、应用领域四、发展前景与挑战五、分类六、研究目标与价值 深度学习定义与核心思想网络结构工作原理关键技术与模型应用领域发展与挑战 人工神经网络一、定义与原理二、基本特性三、网络结构四、工作原理五、应用领域六…...
嵌入式系统应用-LVGL的应用-平衡球游戏 part2
平衡球游戏 part2 4 mpu60504.1 mpu6050 介绍4.2 电路图4.3 驱动代码编写 5 游戏界面移植5.1 移植源文件5.2 添加头文件 6 参数移植6.1 4 mpu6050 4.1 mpu6050 介绍 MPU6050是一款由InvenSense公司生产的加速度计和陀螺仪传感器,广泛应用于消费电子、机器人等领域…...
Linux网络编程之---多线程实现并发服务器
下面我们来使用tcp集合多线程实现并发服务器 一.服务端 #include <stdio.h> #include <arpa/inet.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <pthread.h>typedef struct sockinfo {char ip[16];unsigne…...
架构师的英文:Architect
中文版 软件架构师 的英文是 “Software Architect”。 Software: 软件Architect: 架构师,通常指的是设计和规划某种系统或结构的人。 Software Architect 通常负责软件系统的整体设计、技术选型、架构规划,确保系统的可扩展性、可维护性和高效性等。…...
量化交易系统开发-实时行情自动化交易-8.7.文华平台
19年创业做过一年的量化交易但没有成功,作为交易系统的开发人员积累了一些经验,最近想重新研究交易系统,一边整理一边写出来一些思考供大家参考,也希望跟做量化的朋友有更多的交流和合作。 接下来会对于文华平台介绍。 文华财经…...
【前端】JavaScript 中的创建对象模式要点
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 💯前言💯对象属性值中的引号规则💯对象属性换行与尾随逗号的使用💯工厂模式:灵活高效的对象创建💯自定义构造函数:通过…...
鸿蒙NEXT元服务:论如何免费快速上架作品
【引言】天下武功,唯快不破。 本文讨论如何免费且以最快速度上架自己的作品。 作者以自己从零开始到提交发布审核一共俩小时的操作流程分享给大家作参考。 【1】立项选择 结论:元服务,单机,工具类(非游戏ÿ…...
hive3.1.3安装及基本例子
前提要安装好hadoop环境和mysql。 1、下载并解压 https://archive.apache.org/dist/hive/hive-3.1.3/apache-hive-3.1.3-bin.tar.gz 下载bin包到/app/src中。 cd /app/src/ tar zxvf apache-hive-3.1.3-bin.tar.gz mv apache-hive-3.1.3-bin /app/hive2、配置path nano /etc…...
【设计模式】工厂方法模式 在java中的应用
文章目录 1. 引言工厂方法模式的定义 2. 工厂方法模式的核心概念工厂方法模式的目的和原理与其他创建型模式的比较(如简单工厂和抽象工厂) 3. Java中工厂方法模式的实现基本的工厂方法模式结构示例代码:创建不同类型的日志记录器 4. 工厂方法…...
【热门主题】000079 服务器虚拟化:开启高效计算新时代
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 【热…...
软考高项经验分享:我的备考之路与实战心得
软考,尤其是信息系统项目管理师(高项)考试,对于众多追求职业提升与专业认可的人士来说,是一场充满挑战与机遇的征程。我在当年参加软考高项的经历,可谓是一波三折,其中既有成功的喜悦࿰…...
【小白学机器学习38】用np.random 生成各种随机数,随机数数组/序列
目录 0 总结 np.random() 的一些点 1 用np.random.random() 生成[0,1) 区间内的随机数 2 生成指定范围内的随机整数/数组 np.random.randint() 3 用np.random.choice()生成指定数组范围内的随机数 3.1 np.random.choice(array6) 3.2 np.random.choice(array6) ࿰…...