基于matlab通过多个FIR,IIR形成对violin信号进行均衡

2024-03-17 12:40

本文主要是介绍基于matlab通过多个FIR,IIR形成对violin信号进行均衡,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

基于《数字信号处理》这门课程的课程设计,特意写下这篇博客,仅供有需要的看官参考。

理论知识:

FIR和IIR滤波器是数字信号处理中常用的滤波器类型。设计带通滤波器时,需要考虑滤波器的通带、阻带、过渡带等参数,以及滤波器的阶数、截止频率等设计参数。

FIR滤波器是一种无限脉冲响应滤波器,其基本理论是通过对输入信号的加权和延迟来实现滤波。FIR滤波器的特点是稳定性好、易于设计和实现。

IIR滤波器是一种有限脉冲响应滤波器,其基本理论是通过对输入信号的加权和延迟以及对输出信号的反馈来实现滤波。IIR滤波器的特点是具有较高的性能和效率,但设计和实现相对复杂。

任务要求:设计三种不同增益的均衡器,分别增强低音、中音和高音

首先,我们需要通过matlab获取violin信号时域图和幅频特性:

clc;
clear;
[x0,fs]=audioread('violin.wav');%获取violin信号的波形数据以及采样率
N=length(x0);%获取音频信号长度
t=0:1/fs:(N-1)/fs;%得到时间轴
faxis=fs/N:fs/N:fs/2-fs/N;
%获取波形的时域图以及频谱图
figure
ffx0=fftshift(abs(fft(x0)));ffx=ffx0(N/2+2:N);
subplot(2,1,1);plot(t,x0,'k-','LineWidth',1.5);box off;
xlim([0 max(t)]);%ylim([-3 3]);
xlabel('Time (s)');ylabel('Amplitude');
subplot(2,1,2);plot(faxis,ffx,'k-','LineWidth',1.5);box off;

b08b054a947c4988a2b9bbfed7ff8cff.png

ad86174f5cc24aa8b550ea5d4260243b.png

接着设计多个FIR滤波器实现均衡器:

clc;
clear;
[x0,fs]=audioread('violin.wav');
N=length(x0);
t=0:1/fs:(N-1)/fs;
faxis=fs/N:fs/N:fs/2-fs/N;figure
ffx0=fftshift(abs(fft(x0)));ffx=ffx0(N/2+2:N);
subplot(2,1,1);plot(t,x0,'k-','LineWidth',1.5);box off;
xlim([0 max(t)]);%ylim([-3 3]);
xlabel('Time(s)');ylabel('Amplitude');
subplot(2,1,2);plot(faxis,ffx,'k-','LineWidth',1.5);box off;%%  滤波器指标
rp=0.1;%rp表示通带最大衰减量
rs=0.001;%rs表示阻带最小衰减量Ap=-20*log10(1-rp);
As=-20*log10(rs);%将其转换为dB%该频率是根据上述幅频特性曲线进行选取
wn1=[40 60 700 720];%设置具有过渡带宽为20的通带和阻带,[60,700]在该频率通过,%小于40,大于720的不允许通过,下述9个与之相同
wn2=[740 760 1100 1120]; 
wn3=[1180 1200 1400 1420];
wn4=[1500 1520 1800 1820];  
wn5=[1840 1860 2000 2020]; 
wn6=[2040 2060 2340 2360];  
wn7=[2380 2400 2700 2720]; 
wn8=[2780 2800 3100 3120];  
wn9=[3270 3290 3600 3620];  
%% FIR 均衡器设计 用firpm
%%% 计算滤波器参数 firpmord
mags=[0 1 0];%描述带通
devs=[rs rp rs];%用于计算滤波器参数的值
[n1,f01,ao1,w1]=firpmord(wn1,mags,devs,fs);%计算滤波器参数
[n2,f02,ao2,w2]=firpmord(wn2,mags,devs,fs);
[n3,f03,ao3,w3]=firpmord(wn3,mags,devs,fs);
[n4,f04,ao4,w4]=firpmord(wn4,mags,devs,fs);
[n5,f05,ao5,w5]=firpmord(wn5,mags,devs,fs);
[n6,f06,ao6,w6]=firpmord(wn6,mags,devs,fs);
[n7,f07,ao7,w7]=firpmord(wn7,mags,devs,fs);
[n8,f08,ao8,w8]=firpmord(wn8,mags,devs,fs);
[n9,f09,ao9,w9]=firpmord(wn9,mags,devs,fs);
%%% 计算滤波器系数
hh1=firpm(n1,f01,ao1,w1);%计算滤波器系数
hh2=firpm(n2,f02,ao2,w2);
hh3=firpm(n3,f03,ao3,w3);
hh4=firpm(n4,f04,ao4,w4);
hh5=firpm(n5,f05,ao5,w5);
hh6=firpm(n6,f06,ao6,w6);
hh7=firpm(n7,f07,ao7,w7);
hh8=firpm(n8,f08,ao8,w8);
hh9=firpm(n9,f09,ao9,w9);
%%% 画出滤波器幅频特性曲线
[h1 W1]=freqz(hh1,1,1024);
[h2,W2]=freqz(hh2,1,1024);
[h3,W3]=freqz(hh3,1,1024);
[h4,W4]=freqz(hh4,1,1024);
[h5,W5]=freqz(hh5,1,1024);
[h6,W6]=freqz(hh6,1,1024);
[h7,W7]=freqz(hh7,1,1024);
[h8,W8]=freqz(hh8,1,1024);
[h9,W9]=freqz(hh9,1,1024);
figure; %绘图,均衡器幅频响应
loglog(W1,abs(h1),W2,abs(h2), W3,abs(h3),...
W4,abs(h4),W5,abs(h5),W6,abs(h6),W7,abs(h7),...
W8,abs(h8),W9,abs(h9));
xlabel('Frequency (Hz)r) ;ylabel(filter Gain');
axis([10 10^5   10^(-9) 1]);
%%%  对音乐信号进行均衡并画出频谱
y1=filter(hh1,1,x0);%设计滤波器对x0信号进行滤波
y2=filter(hh2,1,x0);
y3=filter(hh3,1,x0);
y4=filter(hh4,1,x0);
y5=filter(hh5,1,x0);
y6=filter(hh6,1,x0);
y7=filter(hh7,1,x0);
y8=filter(hh8,1,x0);
y9=filter(hh9,1,x0);
g1= 10;g2 = 10;g3 = 10;g4 = 0;
g5 = 0;g6 = 0;g7 = 0;g8 = 0;g9 = 0;
y=y1.*g1+y2.*g2+y3.*g3+y4.*g4+y5.*g5+y6.*g6+y7.*g7+y8.*g8+y9.*g9+x0;
%对前三个信号即低音进行均衡则选取g1,g2,g3设置为10,依次向后推理获得中音和高音均衡
%对均衡信号画出时域和频域波形图
figure
ffy=fftshift(abs(fft(y)));ffy0=ffy(N/2+2:N);
subplot(2,1,1);plot(t,y,'k-','LineWidth',1.5);box off;
xlim([0 max(t)]);%ylim([-3 3]);
xlabel('Time(s)');ylabel('Amplitude');
subplot(2,1,2);plot(faxis,ffy0,'k-','LineWidth',1.5);box off;
%%% 听效果并存储
sound(y);

该均衡器获得的幅频特性曲线如下图:

02a359560ef54b1dabb6ce8175f69743.png

对低音进行均衡后信号的时域频域波形图如下:

44d9b95a932940dca775192c9196d199.png

17f3288000574c01b73dbc61ad805a7b.png

 

对中音进行均衡后信号的时域频域波形图如下:

6bfbd36be1354a0baaa53675c2f20eb4.png

8d18145638a74adbbf927a5790bec49e.png

 

对高音进行均衡后信号的时域频域波形图如下:

f93e4e1c49734fa9a0e6eab421cc02ef.png

967b8dca894848639e3943ffcb2c72ea.png

基于matlab的多个IIR设计实现均衡器:

clc;
clear;
[x0,fs]=audioread('violin.wav');
N=length(x0);
t=0:1/fs:(N-1)/fs;
faxis=fs/N:fs/N:fs/2-fs/N;figure
ffx0=fftshift(abs(fft(x0)));ffx=ffx0(N/2+2:N);
subplot(2,1,1);plot(t,x0,'k-','LineWidth',1.5);box off;
xlim([0 max(t)]);%ylim([-3 3]);
xlabel('Time (s)');ylabel('Amplitude');
subplot(2,1,2);plot(faxis,ffx,'k-','LineWidth',1.5);box off;%% 滤波器指标
Ap=1;
As=20;wp1=[60 700]; ws1=[40 720];
wp2=[760 1100]; ws2=[740 1120];
wp3=[1200 1400]; ws3=[1180 1420];
wp4=[1520 1800]; ws4=[1500 1820];
wp5=[1860 2000]; ws5=[1840 2020];
wp6=[2060 2340]; ws6=[2040 2360];
wp7=[2400 2700]; ws7=[2380 2720];
wp8=[2800 3100]; ws8=[2780 3120];
wp9=[3290 3600]; ws9=[3270 3620];
wp10=[3660 6000];ws10=[3640 6020];%% IIR 均衡器设计 ellip
wpI1=2*wp1/fs;wsI1=2*ws1/fs;%将频率进行归一化
wpI2=2*wp2/fs;wsI2=2*ws2/fs;
wpI3=2*wp3/fs;wsI3=2*ws3/fs;
wpI4=2*wp4/fs;wsI4=2*ws4/fs;
wpI5=2*wp5/fs;wsI5=2*ws5/fs;
wpI6=2*wp6/fs;wsI6=2*ws6/fs;
wpI7=2*wp7/fs;wsI7=2*ws7/fs;
wpI8=2*wp8/fs;wsI8=2*ws8/fs;
wpI9=2*wp9/fs;wsI9=2*ws9/fs;
wpI10=2*wp10/fs;wsI10=2*ws10/fs;%%% 计算滤波器参数 ellipord
[n1,wn1]=ellipord(wpI1,wsI1,Ap,As);Niir1=n1;
[n2,wn2]=ellipord(wpI2,wsI2,Ap,As);Niir2=n2;
[n3,wn3]=ellipord(wpI3,wsI3,Ap,As);Niir3=n3;
[n4,wn4]=ellipord(wpI4,wsI4,Ap,As);Niir4=n4;
[n5,wn5]=ellipord(wpI5,wsI5,Ap,As);Niir5=n5;
[n6,wn6]=ellipord(wpI6,wsI6,Ap,As);Niir6=n6;
[n7,wn7]=ellipord(wpI7,wsI7,Ap,As);Niir7=n7;
[n8,wn8]=ellipord(wpI8,wsI8,Ap,As);Niir8=n8;
[n9,wn9]=ellipord(wpI9,wsI9,Ap,As);Niir9=n9;
[n10,wn10]=ellipord(wpI10,wsI10,Ap,As);Niir10=n10;%%% 计算滤波器系数
[b1,a1]=ellip(n1,Ap,As,wn1);
[b2,a2]=ellip(n2,Ap,As,wn2);
[b3,a3]=ellip(n3,Ap,As,wn3);
[b4,a4]=ellip(n4,Ap,As,wn4);
[b5,a5]=ellip(n5,Ap,As,wn5);
[b6,a6]=ellip(n6,Ap,As,wn6);
[b7,a7]=ellip(n7,Ap,As,wn7);
[b8,a8]=ellip(n8,Ap,As,wn8);
[b9,a9]=ellip(n9,Ap,As,wn9);
[b10,a10]=ellip(n10,Ap,As,wn10);%%% 画出滤波器幅频特性曲线
[h1,W1]=freqz(b1,a1);
[h2,W2]=freqz(b2,a2);
[h3,W3]=freqz(b3,a3);
[h4,W4]=freqz(b4,a4);
[h5,W5]=freqz(b5,a5);
[h6,W6]=freqz(b6,a6);
[h7,W7]=freqz(b7,a7);
[h8,W8]=freqz(b8,a8);
[h9,W9]=freqz(b9,a9);
[h10,W10]=freqz(b10,a10);figure; %绘图,均衡器幅频响应
loglog(W1,abs(h1),W2,abs(h2), W3,abs(h3),...
W4,abs(h4),W5,abs(h5),W6,abs(h6),W7,abs(h7),...
W8,abs(h8),W9,abs(h9),W10,abs(h10));
xlabel('Frequency (Hz)'); ylabel('Filter Gain');
axis([10 10^5 10^-9 1]);%%% 对音乐信号进行均衡并画出频谱
y1=filter(b1,a1,x0);
y2=filter(b2,a2,x0);
y3=filter(b3,a3,x0);
y4=filter(b4,a4,x0);
y5=filter(b5,a5,x0);
y6=filter(b6,a6,x0);
y7=filter(b7,a7,x0);
y8=filter(b8,a8,x0);
y9=filter(b9,a9,x0);
y10=filter(b10,a10,x0);
g1=0; g2=0; g3=0; g4=0;
g5=10; g6=10; g7=10; g8=0; g9=0; g10=0;
y = y1.*g1 + y2.*g2 + y3.*g3 + y4.*g4 + y5.*g5 +...
y6.*g6 + y7.*g7 + y8.*g8 + y9.*g9 + y10.*g10 + x0;figure
ffy=fftshift(abs(fft(y)));ffy0=ffy(N/2+2:N);
subplot(2,1,1);plot(t,y,'k-','LineWidth',1.5);box off;
xlim([0 max(t)]);%ylim([-3 3]);
xlabel('Time(s)');ylabel('Amplitude');
subplot(2,1,2);plot(faxis,ffy0,'k-','LineWidth',1.5);box off;
%%% 听效果并存储
sound(y,fs);

该均衡器获得的幅频特性曲线如下图:

241bf65e6fe84e3bbbd1e0a49e4b1908.png

IIR设计均衡器对低音进行增强后均衡处理后信号的时域,频域图如下:

d111a531f89f43128b09b2ae1240b699.png

3420d689da1a41ed9261aa1ad4f19164.png

IIR设计均衡器对中音进行增强后均衡处理后信号的时域,频域图如下:

dd6e3ecb5a6b46ff8c857dba4c2d4ad5.png

9b836e5d18e34b889705a221c2d11924.png

IIR设计均衡器对高音进行增强后均衡处理后信号的时域,频域图如下:

216ec8d45fb54973a9066a6f66e9bb45.png

c892441676a24c6f9134bb411e2c1dc6.png

上述代码有点呆(很早之前写的代码),各位优化代码可通过数组或for循环进行简化,

另外,若存在错误,请各位多多指正!

 

 

这篇关于基于matlab通过多个FIR,IIR形成对violin信号进行均衡的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/818979

相关文章

Python进行word模板内容替换的实现示例

《Python进行word模板内容替换的实现示例》本文介绍了使用Python自动化处理Word模板文档的常用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录技术背景与需求场景核心工具库介绍1.获取你的word模板内容2.正常文本内容的替换3.表格内容的

Git进行版本控制的实战指南

《Git进行版本控制的实战指南》Git是一种分布式版本控制系统,广泛应用于软件开发中,它可以记录和管理项目的历史修改,并支持多人协作开发,通过Git,开发者可以轻松地跟踪代码变更、合并分支、回退版本等... 目录一、Git核心概念解析二、环境搭建与配置1. 安装Git(Windows示例)2. 基础配置(必

Nginx中配置使用非默认80端口进行服务的完整指南

《Nginx中配置使用非默认80端口进行服务的完整指南》在实际生产环境中,我们经常需要将Nginx配置在其他端口上运行,本文将详细介绍如何在Nginx中配置使用非默认端口进行服务,希望对大家有所帮助... 目录一、为什么需要使用非默认端口二、配置Nginx使用非默认端口的基本方法2.1 修改listen指令

MySQL按时间维度对亿级数据表进行平滑分表

《MySQL按时间维度对亿级数据表进行平滑分表》本文将以一个真实的4亿数据表分表案例为基础,详细介绍如何在不影响线上业务的情况下,完成按时间维度分表的完整过程,感兴趣的小伙伴可以了解一下... 目录引言一、为什么我们需要分表1.1 单表数据量过大的问题1.2 分表方案选型二、分表前的准备工作2.1 数据评估

Python批量替换多个Word文档的多个关键字的方法

《Python批量替换多个Word文档的多个关键字的方法》有时,我们手头上有多个Excel或者Word文件,但是领导突然要求对某几个术语进行批量的修改,你是不是有要崩溃的感觉,所以本文给大家介绍了Py... 目录工具准备先梳理一下思路神奇代码来啦!代码详解激动人心的测试结语嘿,各位小伙伴们,大家好!有没有想

MySQL进行分片合并的实现步骤

《MySQL进行分片合并的实现步骤》分片合并是指在分布式数据库系统中,将不同分片上的查询结果进行整合,以获得完整的查询结果,下面就来具体介绍一下,感兴趣的可以了解一下... 目录环境准备项目依赖数据源配置分片上下文分片查询和合并代码实现1. 查询单条记录2. 跨分片查询和合并测试结论分片合并(Shardin

SpringBoot结合Knife4j进行API分组授权管理配置详解

《SpringBoot结合Knife4j进行API分组授权管理配置详解》在现代的微服务架构中,API文档和授权管理是不可或缺的一部分,本文将介绍如何在SpringBoot应用中集成Knife4j,并进... 目录环境准备配置 Swagger配置 Swagger OpenAPI自定义 Swagger UI 底

基于Python Playwright进行前端性能测试的脚本实现

《基于PythonPlaywright进行前端性能测试的脚本实现》在当今Web应用开发中,性能优化是提升用户体验的关键因素之一,本文将介绍如何使用Playwright构建一个自动化性能测试工具,希望... 目录引言工具概述整体架构核心实现解析1. 浏览器初始化2. 性能数据收集3. 资源分析4. 关键性能指

Nginx进行平滑升级的实战指南(不中断服务版本更新)

《Nginx进行平滑升级的实战指南(不中断服务版本更新)》Nginx的平滑升级(也称为热升级)是一种在不停止服务的情况下更新Nginx版本或添加模块的方法,这种升级方式确保了服务的高可用性,避免了因升... 目录一.下载并编译新版Nginx1.下载解压2.编译二.替换可执行文件,并平滑升级1.替换可执行文件

Go语言使用select监听多个channel的示例详解

《Go语言使用select监听多个channel的示例详解》本文将聚焦Go并发中的一个强力工具,select,这篇文章将通过实际案例学习如何优雅地监听多个Channel,实现多任务处理、超时控制和非阻... 目录一、前言:为什么要使用select二、实战目标三、案例代码:监听两个任务结果和超时四、运行示例五