matlab构造线性相位FIR滤波器

news/2025/1/23 11:54:36/

文章目录

  • 前言
  • 一、构造一组声音
  • 二、采用FIR滤波器做频率筛选


前言

用生成的一组音频文件举例


一、构造一组声音

模拟钢琴音乐,采用逐渐衰减振荡的正弦波
在这里插入图片描述
FFT的频域展示:
在这里插入图片描述
源代码:

matlab">function sound_firFs = 1000; % 采样频率freq = [200, 230, 260, 290, 320, 350, 380,410, 440,470]; % 频率数组rythm = 0.5; % 持续时间,单位:秒gap_duration = 0.2; % 间隔时间,单位:秒y = []; % 初始化 ynote_length = numel(freq); % 使用频率的长度% 生成时间向量x = linspace(0, rythm, floor(Fs * rythm));s = zeros(note_length, numel(x)); % 生成每个频率的波形for i = 1:note_lengths(i, :) = sin(2 * pi * freq(i) * x) .* (1 - x / (rythm)); end% 合并音频信号,并添加间隔for i = 1:note_lengthy = [y, s(i, :)]; % 添加当前音符% 添加间隔y = [y, zeros(1, round(Fs * gap_duration))]; % 插入0.2秒间隔endsound(y, Fs); % 播放合成的音频% 做FFT频域变换N = length(y); % 采样点数frequence = fft(y); % 对时域信号进行FFT变换% 幅值修正F2 = (frequence / N);F1 = F2(1:N/2+1); % 选取前半部分F1(2:end-1) = 2 * F1(2:end-1);% 画图f = Fs * (0:(N/2)) / N;% 对其中一段做FFT频域变换N0 = length(s(1, :)); % 采样点数frequence_single = fft(s(1, :)); % 对第一个音符进行FFT变换% 幅值修正F20 = (frequence_single / N0);F10 = F20(1:N0/2+1); % 选取前半部分F10(2:end-1) = 2 * F10(2:end-1);% 绘图f0 = Fs * (0:(N0/2)) / N0;subplot(221);plot(x, s(2, :)); title('单个输入音频的时域信号'); xlabel('时间 (s)'); ylabel('幅度');%可以设置是哪个频率的音频subplot(222);plot(linspace(0, length(y) / Fs, length(y)), y); title('输入音频的时域信号'); xlabel('时间 (s)'); ylabel('幅度');subplot(223);plot(f, abs(F1)); title('全部频域信号'); xlabel('频率 (Hz)'); ylabel('|F1(f)|'); xlim([0 600]);audiowrite('D:\matlab\DSP\sound.wav', y, Fs);student_id = [0 0 0 0 0 0 0 0 0 0 0 0 0];BP_filter = [];% FIR的构造for i = 1:length(student_id)wc = 2 * pi * freq(student_id(i) + 1) / Fs;% 频域函数N1 = 500; % 窗函数长度(阶数)f0 = freq(student_id(i) + 1); % 中心频率 (Hz)bw = 20;  % 带宽 (Hz)% 创建频率轴f1 = linspace(0, Fs, N1);% 创建带通滤波器的频率响应BP_filter_row = (abs(f1 - f0) <= bw / 2);  % 频率响应BP_filter = [BP_filter; BP_filter_row];  % 按行添加到 BP_filter 中endHBP = sum(BP_filter);subplot(224);for i = 1:length(student_id)plot(f1, BP_filter(i, :)); title('构造的理想滤波器——频域'); xlabel('频率 (Hz)'); ylabel('BP_filter'); xlim([0 900]); ylim([0 2]);hold on; end   end

二、采用FIR滤波器做频率筛选

这里采用窗函数构造FIR,将频域上的理想窄带信号,根据IDFT转换为时域的函数,再与汉明窗叠加得到最后的系统函数

matlab">  %FIR的构造hlp=[];fliters=[];for i=1:length(student_id)%时域函数wc=2*pi*freq(student_id(i)+1)/Fs;N=500;nd=(N+1)/2;%群延时为阶数的一半f0 = freq(student_id(i)+1); % 中心频率 (Hz)bw = 20;  % 带宽 (Hz)wc1=(wc+pi*bw/Fs);%连续转离散,尺度归一化wc2=(wc-pi*bw/Fs);n = linspace(0,N, N);  % 创建n轴,假设滤波器长度为Fshlp_row=(sin(wc1 * (n-nd)) - sin(wc2 * (n - nd))) ./ (pi * (n-nd));   hlp_row(isnan(hlp_row)) = wc / pi;  % 处理n=nd时的奇点hlp=[hlp;hlp_row];%窗函数hamming_window = 0.54 - 0.46 * cos(2 * pi * (0:N-1) / (N-1));h = hlp_row .* hamming_window; % 应用窗函数fliters = [fliters;h]; % 存储滤波器end

http://www.ppmy.cn/news/1565477.html

相关文章

STM32CubeIDE使用笔记(一)

IDE 窗口布局介绍 《STM32MP1 M4裸机CubeIDE开发指南》第四章 STM32CubeIDE的使用 - 知乎 1.恢复IDE窗口默认布局 2.Packages Manager 3.Generate Code &#xff1a;ctrls 或Pro>G C 4.编译工程

AF3 ConditionedTransitionBlock类源码解读

ConditionedTransitionBlock类的核心功能是对输入特征进行非线性变换,并通过条件输入(s)自适应地调整特征的表示。 主要模块包括: 自适应层归一化(ada_ln):用于动态调整特征分布。两组线性变换(hidden_gating_linear 和 hidden_linear):用于构造特征空间中的非线性变…

AI对齐与开源发展:多学科融合创新之路

标题&#xff1a;AI对齐与开源发展&#xff1a;多学科融合创新之路 文章信息摘要&#xff1a; 本文分析了AI对齐研究中多学科融合的重要性及开源AI领域的最新发展。文章指出&#xff0c;AI对齐问题需要计算机科学与社会选择理论等学科深度结合&#xff0c;特别是在RLHF领域的应…

Anthropic 正计划为其聊天机器人 Claude 推出“双向语音模式”和一个新的记忆功能

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

pytorch torch.vmap函数介绍

torch.vmap 是 PyTorch 提供的一个高效矢量化映射函数,用于对批量数据上的操作进行自动矢量化。它可以显著提高代码的性能和可读性,避免显式使用循环来操作批量数据。 torch.vmap 的核心功能 对函数进行批量化操作。自动扩展函数,使其可以作用于批量输入(即 N 个样本)。提…

数据结构学习记录-算法

1、算法的概念 算法(Algorithm)的概念在计算机科学领域中几乎无处不在&#xff0c;在各种计算机系统的实现中&#xff0c;算法的设计往往处在核心的位置。计算机的问世是20世纪算法是计算机科学的重要基础&#xff0c;就像算盘一样&#xff0c;人们需要为计算机编制各种各样的…

.hex 文件和.bin 文件的区别?

.bin 文件是一种二进制文件格式&#xff0c;它包含了以二进制形式存储的数据或程序代码。对于微控制器或嵌入式系统而言&#xff0c;.bin 文件通常包含了可以直接被处理器执行的机器码。 .hex也是一种常用的存储可执行代码的文件格式&#xff0c;与 .bin 文件不同的是&#xff…

华为支付-(可选)特定场景配置操作

如涉及以下场景&#xff0c;需提前完成相关产品的开通或配置操作。如不涉及&#xff0c;则不需要配置。 场景一&#xff1a;产品开通操作 部分支付场景接入涉及产品开通&#xff0c;未开通产品直接接入&#xff0c;商户请求华为支付开放的API接口时可能会导致“商户未找到对应的…