重邮+数字信号处理实验六:用 MATLAB 设计 IIR 数字滤波器

一、实验目的

1、加深对 IIR 数字滤波器设计方法和设计步骤的理解;

2、掌握用模拟滤波器原型设计 IIR 数字滤波器的方法;

3、能编写 MATLAB 函数,掌握设计 IIR 数字滤波器的函数调用方法;

4、根据不同的应用场景,确定不同的设计指标,设计出具有不同功能和性能的滤波器。不同滤波器的设计方法具有不同的优缺点,因此要全面、客观看待可能面对或出现的问题。

二、实验任务

1、用双线性变换法设计的巴特沃斯数字低通滤波器

要求:ωp=0.2πRp=1dB;阻带:ωs=0.35πAs=15dB,滤波器采样频率 Fs=10Hz

任务一结果图示例

2、用 1 设计的数字滤波器对实际心电图信号采样序列(实验原理中已给出) 进行滤波处理,分别绘制出滤波前后的心电图波形图和其幅频特性曲线,观察总结滤波作用与效果。

实验结果如图:

任务二示例图

3、设计一个抗混叠低通滤波器(可在实验内容 1 的代码上进行修改,衰减指标与实验内容 1 一样)。

  1. 读取音频信号motherland.wav,得到 xn
  2. xn 进行 D=2 的整数倍抽取,得到整数倍抽取后的音频信号 yn1
  3. xn 先进行抗混叠滤波,再进行 D=2 的整数倍抽取,得到音频信号 yn2

提示:

  • 音频播放:依次原始声音 xn、没有经抗混叠滤波进行整数倍抽取的音频 yn1、经过抗混叠滤波进行整数倍抽取的音频 yn2,体验音频有频域混叠时的音质。
    参考代码:
    [xn,fs]=audioread('motherland.wav');% 读取音频信号
    sound(xn,fs); 
    pause(length(xn)/fs);% 播放音频信号,暂停执行程序 length(xn)/fs 秒 
    yn1=xn(1:D:length(xn)); % 每个 D-1 个点抽取 1 点,这里 D=2
    sound(yn1,fs/D); % 采用频谱降低到 fs/D
  • 取原音频某段信号,如 n=8000~8199。画出该段信号模拟域幅度谱(横坐标为 f Hz);画出该段信号 D=2 抽取后的模拟域幅度谱;画出该段信号先经过抗混叠滤波再进行 D=2 抽取的模拟域幅度谱。
    参考代码:
    Xn=1/fs*fft(xn(8000:8199),N); % 从xn中取200点,N可取2018
    plot((0:N/2-1)*fs/N,abs(Xn(1:N/2))); % 模拟域幅度谱
    Yn1=D/fs*fft(yn1(8000:8099),N); % 2点取1点后,200点长变成了100点长
    plot((0:N/2-1)*fs/(N*D),abs(Yn1(1:N/2)));% 模拟域幅度谱

 三、思考题

 按照如下指标要求设计四种选频数字滤波器,要求画出滤波器的幅频特性、相频特性和幅度衰减曲线,标注相关信息,如横坐标,纵坐标的单位,曲线名称等。(设计方法自己查阅资料完成)

  • (1) 设计数字低通滤波器,指标为:通带截止频率𝜔𝑝 = 0.2𝜋,阻带截止频率𝜔𝑠 = 0.3𝜋,通带衰减𝛼𝑝 = 1𝑑𝐵,阻带衰减𝛼𝑠 = 20𝑑𝐵
  • (2) 设计数字高通滤波器,指标为:阻带截止频率𝜔𝑠 = 0.4𝜋,通带截止频率𝜔𝑠 = 0.6𝜋,通带衰减𝛼𝑝 = 2𝑑𝐵,阻带衰减𝛼𝑠 = 30𝑑𝐵
  • (3) 设计数字带通滤波器,指标为:通带范围0.2𝜋 ≤ 𝜔 ≤ 0.6𝜋,阻带范围0 ≤𝜔 ≤ 0.15𝜋0.65𝜋 ≤ 𝜔 ≤ 𝜋,通带衰减𝛼𝑝 = 1𝑑𝐵,阻带衰减𝛼𝑠 = 45𝑑𝐵
  • (4) 设计数字带阻滤波器,指标为:阻带范围0.2𝜋 ≤ 𝜔 ≤ 0.6𝜋,通带范围0 ≤ 𝜔 ≤ 0.15𝜋0.65𝜋 ≤ 𝜔 ≤ 𝜋,通带衰减𝛼𝑝 = 1𝑑𝐵,阻带衰减𝛼𝑠 = 45𝑑𝐵

解答

函数部分

函数文件一定要和你调用的程序在一个文件夹下面

作用:通过输入wp,ws,Rp,As,Fs,可以得到bd,ad,dbH,ripple,Attn,w,反复调用,节省时间

function [bd,ad,dbH,ripple,Attn,w]=myl(wp,ws,Rp,As,Fs)
% %% 参数设置 
T = 1 / Fs; % 采样周期 % %% 预处理 
ripple = 10^(-Rp/20); % 通带波动 
Attn = 10^(-As/20); % 阻带衰减 
Omgp = (2 / T) * tan(wp / 2); % 原型通带频率的预修正 
Omgs = (2 / T) * tan(ws / 2); % 原型阻带频率的预修正 % %% 设计巴特沃斯滤波器 
[n, Omgc] = buttord(Omgp, Omgs, Rp, As, 's'); % 计算阶数 n 和截止频率 
[z0, p0, k0] = buttap(n); % 设计归一化的巴特沃斯模拟滤波器原型 
bal = k0 * real(poly(z0)); % 求原型滤波器的系数 b 
aa1 = real(poly(p0)); % 求原型滤波器的系数 a 
[ba, aa] = lp2lp(bal, aa1, Omgc); % 变换为模拟低通滤波器 % %% 转换为数字滤波器 
[bd, ad] = bilinear(ba, aa, Fs); % 用双线性变换法计算数字滤波器系数 % %% 计算频率响应 
[H, w] = freqz(bd, ad, 1024); % 计算数字滤波器的频率响应 
dbH = 20 * log10((abs(H) + eps) / max(abs(H))); % 转换为 dB,避免<num>为零 
end

 主程序部分

任务一

% %% 参数设置 
wp = 0.2 * pi; % 通带频率 
ws = 0.35 * pi; % 阻带频率 
Rp = 1; % 通带波动 (dB) 
As = 15; % 阻带衰减 (dB) 
Fs = 10; % 采样频率 
T = 1 / Fs; % 采样周期 % %% 预处理 
ripple = 10^(-Rp/20); % 通带波动 
Attn = 10^(-As/20); % 阻带衰减 
Omgp = (2 / T) * tan(wp / 2); % 原型通带频率的预修正 
Omgs = (2 / T) * tan(ws / 2); % 原型阻带频率的预修正 % %% 设计巴特沃斯滤波器 
[n, Omgc] = buttord(Omgp, Omgs, Rp, As, 's'); % 计算阶数 n 和截止频率 
[z0, p0, k0] = buttap(n); % 设计归一化的巴特沃斯模拟滤波器原型 
bal = k0 * real(poly(z0)); % 求原型滤波器的系数 b 
aa1 = real(poly(p0)); % 求原型滤波器的系数 a 
[ba, aa] = lp2lp(bal, aa1, Omgc); % 变换为模拟低通滤波器 % %% 转换为数字滤波器 
[bd, ad] = bilinear(ba, aa, Fs); % 用双线性变换法计算数字滤波器系数 % %% 计算频率响应 
[H, w] = freqz(bd, ad, 1024); % 计算数字滤波器的频率响应 
dbH = 20 * log10((abs(H) + eps) / max(abs(H))); % 转换为 dB,避免<num>为零 % %% 绘制响应图 
figure; 
subplot(2,2,1); 
plot(w/pi, abs(H), 'LineWidth', 1.5); 
ylabel('H'); 
title('幅度响应'); 
axis([0, 1, 0, 1.1]); 
set(gca, 'XTickMode', 'manual', 'XTick', [0, 0.2, 0.35, 1]); 
set(gca, 'YTickMode', 'manual', 'YTick', [0, Attn, ripple, 1]); 
grid on; subplot(2,2,2); 
plot(w/pi, angle(H)/pi, 'LineWidth', 1.5); 
ylabel('\phi'); 
title('相位响应'); 
axis([0, 1, -1, 1]); 
set(gca, 'XTickMode', 'manual', 'XTick', [0, 0.2, 0.35, 1]); 
set(gca, 'YTickMode', 'manual', 'YTick', [-1, 0, 1]); 
grid on; subplot(2,2,3); 
plot(w/pi, dbH, 'LineWidth', 1.5); 
title('幅度响应(dB)'); 
ylabel('dB'); 
xlabel('频率 (\pi)'); 
axis([0, 1, -40, 5]); 
set(gca, 'XTickMode', 'manual', 'XTick', [0, 0.2, 0.35, 1]); 
set(gca, 'YTickMode', 'manual', 'YTick', [-50, -15, -1, 0]); 
grid on; subplot(2,2,4); 
zplane(bd, ad); 
axis([-1.1, 1.1, -1.1, 1.1]); 
title('零极点图'); 
grid on; 

任务二

除了使用函数以外,其实在运行了实验以后,工作区的值是可以直接调用的,比使用函数更加节省时间

%%第二题
% 原始信号 
xn = [-4,-2,0,-4,-6,-4,-2,-4,-6,-6,-4,-4,-6,-6,-2,6,12,8,... 
0,-16,-38,-60,-84,-90,-66,-32,-4,-2,-4,8,12,12,10,6,6,6,... 
4,0,0,0,0,0,-2,-4,0,0,0,-2,-2,0,0,-2,-2,-2,-2,0]; % 使用滤波器对信号进行处理 
[BD,AD]=myl(0.2 * pi,0.35 * pi,1,15,10);
yn = filter(BD, AD, xn); % 绘制图形 
figure(2); % 绘制滤波前后的心电图波形 
subplot(2, 1, 1); 
stem(0:length(xn)-1, xn, 'filled'); 
title('滤波前心电图波形'); 
xlabel('时间 (采样点)'); 
ylabel('幅值'); 
grid on; 
ylim([-100, 20]); % 设置 y 轴范围 
yticks(-100:20:20); % 设置 y 轴刻度间距为 20 subplot(2, 1, 2); 
stem(0:length(yn)-1, yn, 'filled'); 
title('滤波后心电图波形'); 
xlabel('时间 (采样点)'); 
ylabel('幅值'); 
grid on; 
ylim([-100, 40]); % 设置 y 轴范围 
yticks(-100:20:20); % 设置 y 轴刻度间距为 10 % 绘制归一化频率幅频特性曲线 
N = 1024; % FFT点数 
Xf = fft(xn, N); % 原始信号的FFT 
Yf = fft(yn, N); % 滤波后信号的FFT 
k = 0:N-1; figure(3)
subplot(2, 1, 1); 
plot(k*2/N, abs(Xf)); % 绘制幅频特性 
title('滤波前幅频特性'); 
xlabel('\omega / \pi'); 
ylabel('幅值'); 
grid on; 
ylim([0, 500]); % 根据幅频特性设定y轴范围 
yticks(0:100:500); % 设置 y 轴刻度(间距根据实际情况调整) subplot(2, 1, 2); 
plot(k*2/N, abs(Yf)); % 绘制幅频特性 
title('滤波后幅频特性'); 
xlabel('\omega / \pi'); 
ylabel('幅值'); 
grid on; 
ylim([0, 500]); % 根据幅频特性设定y轴范围 
yticks(0:100:500); % 设置 y 轴刻度(间距根据实际情况调整)

任务三

要适当更改wp和ws,让过渡带不那么突兀

%% 第一问 
D = 2; % 抽取因子 
[xn, fs] = audioread("motherland.wav"); % 读取音频信号 
%sound(xn, fs); % 播放原始音频 
%pause(length(xn) / fs); % 等待音频播放完成 % 对信号进行抽取 
yn1 = xn(1:D:end); % 每D个点抽取一个点 
%sound(yn1, fs / D); % 播放抽取后的信号 
%pause(length(yn1) / (fs / D)); % 等待音频播放完成 %滤波器设计 
wc = pi / D; % 截止频率(归一化) 
wp = wc * 0.965; % 通带截止频率 (稍低于截止频率) 
ws = wc * 1; % 阻带截止频率 (稍高于截止频率) 
Rp = 1; % 通带波动 (dB) 
As = 15; % 阻带衰减 (dB) 
Fs = fs / D; % 采样频率 [bd, ad] = myl(wp,ws,Rp,As,Fs); % 对原始信号进行滤波 
yn2 = filter(bd, ad, xn); 
yn2_down=yn2(1:D:length(yn2));
%sound(yn2_down, fs / D); % 播放滤波后的信号 
%pause(length(yn2_down) / (fs / D)); % 等待音频播放完成 %% 第二问,第三问
N = 2018; % FFT的长度 
figure(1); % 原始信号的频谱分析 
Xn = 1/fs * fft(xn(8000:8199), N); 
subplot(2, 1, 1); 
plot((0:N/2-1)*fs/N, abs(Xn(1:N/2))); % 绘制幅度谱 
title('原始信号的频谱'); % 添加标题 
xlabel('频率 (Hz)'); 
ylabel('幅度'); % 抽取信号的频谱分析 
Yn1 = D/fs * fft(yn1(4000:4099), N); % 计算抽取信号的FFT 
subplot(2, 1, 2); 
plot((0:N/2-1)*fs/(N*D), abs(Yn1(1:N/2))); 
title('抽取信号的频谱'); 
xlabel('频率 (Hz)'); 
ylabel('幅度'); % 滤波器频率响应
figure(2);
subplot(211);
freqz(bd, ad, 1024);
title('抗混叠滤波器频率响应');% 抗混叠滤波
yn2 = filter(bd, ad, xn);
yn2_downsampled = yn2(1:D:length(yn2)); % 抽取
sound(yn2_downsampled, fs / D);% 滤波后抽取信号频谱
Yn2 = D/fs * fft(yn2_downsampled(4000:4099), N);
subplot(212);
plot((0:N/2-1)*fs/(N*D), abs(Yn2(1:N/2)));
title('抗混叠滤波后信号频谱');

思考题

%低通滤波器
% 参数设置
wp = 0.2 * pi; 
ws = 0.3 * pi;
ap = 1; 
as = 20;% 设计低通滤波器
[n, Wn] = buttord(wp/pi, ws/pi, ap, as);
[b, a] = butter(n, Wn, 'low');% 绘制幅频特性和相频特性
[H, w] = freqz(b, a, 1024);
figure();
subplot(2, 1, 1);
plot(w/pi, 20*log10(abs(H)));
title('幅频特性');
xlabel('\omega / \pi');
ylabel('幅值 (dB)');
grid on;subplot(2, 1, 2);
plot(w/pi, angle(H));
title('相频特性');
xlabel('\omega / \pi');
ylabel('相位 (rad)');
grid on;%高通滤波器
% 参数设置
wp = 0.6 * pi;
ws = 0.4 * pi;
ap = 2; 
as = 30;% 设计高通滤波器
[n, Wn] = buttord(wp/pi, ws/pi, ap, as);
[b, a] = butter(n, Wn, 'high');% 绘制幅频特性和相频特性
[H, w] = freqz(b, a, 1024);
figure();
subplot(2, 1, 1);
plot(w/pi, 20*log10(abs(H)));
title('幅频特性');
xlabel('\omega / \pi');
ylabel('幅值 (dB)');
grid on;subplot(2, 1, 2);
plot(w/pi, angle(H));
title('相频特性');
xlabel('\omega / \pi');
ylabel('相位 (rad)');
grid on;%设计带通滤波器
% 参数设置
wp = [0.2, 0.6] * pi; 
ws = [0.15, 0.65] * pi;
ap = 1; 
as = 45;% 带通滤波器
[n, Wn] = buttord(wp/pi, ws/pi, ap, as);
[b, a] = butter(n, Wn, 'bandpass');% 绘制幅频特性和相频特性
[H, w] = freqz(b, a, 1024);
figure();
subplot(2, 1, 1);
plot(w/pi, 20*log10(abs(H)));
title('幅频特性');
xlabel('\omega / \pi');
ylabel('幅值 (dB)');
grid on;subplot(2, 1, 2);
plot(w/pi, angle(H));
title('相频特性');
xlabel('\omega / \pi');
ylabel('相位 (rad)');
grid on;%带阻滤波器
% 参数设置
wp = [0.15, 0.65] * pi;
ws = [0.2, 0.6] * pi;
ap = 1; 
as = 45;% 设计带阻滤波器
[n, Wn] = buttord(wp/pi, ws/pi, ap, as);
[b, a] = butter(n, Wn, 'stop');% 绘制幅频特性和相频特性
[H, w] = freqz(b, a, 1024);
figure();
subplot(2, 1, 1);
plot(w/pi, 20*log10(abs(H)));
title('幅频特性');
xlabel('\omega / \pi');
ylabel('幅值 (dB)');
grid on;subplot(2, 1, 2);
plot(w/pi, angle(H));
title('相频特性');
xlabel('\omega / \pi');
ylabel('相位 (rad)');
grid on;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/67143.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mac intel芯片下载安卓模拟器

一、调研 目前主流两个模拟器&#xff1a; 雷神模拟器 不支持macosmumu模拟器pro版 不支持macos intel芯片 搜索到mumu的Q&A中有 “Intel芯片Mac如何安装MuMu&#xff1f;” q&a&#x1f517;&#xff1a;https://mumu.163.com/mac/faq/install-on-intel-mac.html 提…

fast-crud select下拉框 实现多选功能及下拉框数据动态获取(通过接口获取)

教程 fast-crud select示例配置需求:需求比较复杂 1. 下拉框选项需要通过后端接口获取 2. 实现多选功能 由于这个前端框架使用逻辑比较复杂我也是第一次使用,所以只记录核心问题 环境:vue3,typescript,fast-crud ,elementPlus 效果 代码 // crud.tsx文件(/.ts也行 js应…

【伪随机数】关于排序算法自测如何生成随机数而引发的……

以 Random 开始 可能一开始&#xff0c;你只是写到了排序算法如何生成随机数 public static void main(String[] args) {Random random new Random();int[] nums new int[10];for (int i 0; i < nums.length; i) {nums[i] random.nextInt(100);}System.out.println(&q…

项目概述、开发环境搭建(day01)

软件开发整体介绍 软件开发流程 第1阶段: 需求分析 需求规格说明书&#xff0c; 一般来说就是使用 Word 文档来描述当前项目的各个组成部分&#xff0c;如&#xff1a;系统定义、应用环境、功能规格、性能需求等&#xff0c;都会在文档中描述。产品原型&#xff0c;一般是通过…

1Hive概览

1Hive概览 1hive简介2hive架构3hive与Hadoop的关系4hive与传统数据库对比5hive的数据存储 1hive简介 Hive是基于Hadoop的一个数据仓库工具&#xff0c;可以将结构化的数据文件映射为一张数据库表&#xff0c;并提供类SQL查询功能。 其本质是将SQL转换为MapReduce/Spark的任务进…

Hive迁移,小表(10G以下的),分区快速修复批量脚本

hive迁移要迁移元数据&#xff08;mysql&#xff09;&#xff0c;要迁移实际数据hdfs&#xff0c;迁移完后如果有分区&#xff0c;通常是不能访问的。 这里就要修复分区了&#xff0c;如果是大表&#xff0c;几十T这种&#xff0c;迁移可能花了24小时&#xff0c;那么你修复分…

Vulnhub DC-9靶机实战

前言 这里说一下这个靶机的难点 1.这次sql注入是两个库的&#xff0c;在不使用sqlmap的情况下很多人直接database()看数据库&#xff0c;另一个库反倒没关注 2.nmap的扫描方式如果用-sT的tcp连接扫端口的话是扫不到那些被防火墙过滤的端口的&#xff0c;直接nmap ip就可以 3…

快速、可靠且高性价比的定制IP模式提升芯片设计公司竞争力

作者&#xff1a;Karthik Gopal&#xff0c;SmartDV Technologies亚洲区总经理 智权半导体科技&#xff08;厦门&#xff09;有限公司总经理 无论是在出货量巨大的消费电子市场&#xff0c;还是针对特定应用的细分芯片市场&#xff0c;差异化芯片设计带来的定制化需求也在芯片…

【Git版本控制器--1】Git的基本操作--本地仓库

目录 初识git 本地仓库 认识工作区、暂存区、版本库 add操作与commit操作 master文件与commit id 修改文件 版本回退 撤销修改 删除文件 初识git Git 是一个分布式版本控制系统&#xff0c;主要用于跟踪文件的更改&#xff0c;特别是在软件开发中。 为什么要版本…

2025宝塔API一键建站系统PHP源码

源码介绍 2025宝塔API一键建站系统PHP源码&#xff0c;对接自己的支付&#xff0c;虚拟主机也能搭建&#xff0c;小白式建站系统&#xff0c;基于宝塔面板搭建的建站系统&#xff0c;功能丰富&#xff0c;多款模板&#xff0c;每日更新 上传源码到服务器&#xff0c;浏览器访问…

在IDEA上运行Java项目

新建一个项目&#xff0c;下面创建模块&#xff0c;然后在src下新建包名&#xff0c;最后见类&#xff08;class&#xff09; 设置主题 settings>apparence 设置字体 Editor> Font 设置注释 Editor>Color Scheme>Language Defaults>Comments 设置自动导包 …

2025年01月13日Github流行趋势

1. 项目名称&#xff1a;Jobs_Applier_AI_Agent 项目地址url&#xff1a;https://github.com/feder-cr/Jobs_Applier_AI_Agent项目语言&#xff1a;Python历史star数&#xff1a;25929今日star数&#xff1a;401项目维护者&#xff1a;surapuramakhil, feder-cr, cjbbb, sarob…

DHCP、MSTP+VRRP总结实验

R1即使服务器&#xff08;给予dhcp的地址的&#xff09; [LSW1]int Eth-Trunk 12 [LSW1-Eth-Trunk12]mode manual load-balance //配置链路聚合模式为手工负载分担模式 [LSW1-Eth-Trunk12]load-balance src-dst-mac //配置基于源目IP的负载分担模式[LSW1-Eth-Trunk12]trunk p…

【ArcGIS初学】产生随机点计算混淆矩阵

混淆矩阵&#xff1a;用于比较分类结果和地表真实信息 总体精度(overall accuracy) :指对角线上所有样本的像元数(正确分类的像元数)除以所有像元数。 生产者精度(producers accuracy) &#xff1a;某类中正确分类的像元数除以参考数据中该类的像元数(列方向)&#xff0c;又称…

有一台服务器可以做哪些很酷的事情

有一台服务器可以做哪些很酷的事情 今天我也来简单分享一下&#xff0c;这几年来&#xff0c;我用云服务器做了哪些有趣的事情。 服务器推荐 1. 个人博客 拥有个人服务器&#xff0c;你可以完全掌控自己的网站或博客。 与使用第三方托管平台相比&#xff0c;你能自由选择网站…

科研绘图系列:R语言绘制Y轴截断分组柱状图(y-axis break bar plot)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍特点意义加载R包数据下载导入数据数据预处理画图输出总结系统信息介绍 Y轴截断分组柱状图是一种特殊的柱状图,其特点是Y轴的刻度被截断,即在某个范围内省略了部分刻度。这种图表…

pytest+request+yaml+allure搭建低编码调试门槛的接口自动化框架

接口自动化非常简单&#xff0c;大致分为以下几步&#xff1a; 准备入参调用接口拿到2中response&#xff0c;继续组装入参&#xff0c;调用下一个接口重复步骤3校验结果是否符合预期 一个优秀接口自动化框架的特点&#xff1a; 【编码门槛低】&#xff0c;又【能让新手学到…

三轴云台之RTSP流分辨率

三轴云台是一种能够在三个轴向上&#xff08;通常是俯仰、偏航和滚动轴&#xff09;准确、稳定地控制其负载&#xff08;如相机、传感器等&#xff09;位置和姿态的设备。而RTSP&#xff08;Real Time Streaming Protocol&#xff09;是一种网络控制协议&#xff0c;用于控制媒…

Facebook 隐私变革之路:回顾与展望

在数字时代&#xff0c;个人隐私的保护一直是社交平台面临的重大挑战之一。作为全球最大的社交网络平台&#xff0c;Facebook&#xff08;现为Meta&#xff09;在处理用户隐私方面的变革&#xff0c;历经了多次调整与完善。本文将回顾Facebook在隐私保护方面的历程&#xff0c;…

STM32 USB组合设备 MSC CDC

STM32 USB组合设备 MSC CDC实现 教程 教程请看大佬niu_88 手把手教你使用USB的CDCMSC复合设备&#xff08;基于stm32f407&#xff09; 大佬的教程很好&#xff0c;很详细&#xff0c;我调出来了&#xff0c;代码请见我绑定的资源 注意事项 值得注意的是&#xff1a; 1、 cu…