freqz之C实现例程

article/2025/10/9 4:13:30

参考文章

  • 绘制数字滤波器的频域响应
  • gnuplot

Octave

pkg load signalb=[+1.009874 -1.973835 +0.980993];
a=[+1.000000 -1.973835 +0.990867];Fs = 48000
for k=1:Fsw(k)=2*pi*(k-1)/(Fs - 1);z=exp(j*w(k));Z=[1 z^-1 z^-2];H_z(k)=sum(b.*Z)./sum(a.*Z);
end% Transfer from Rad to Hz.
fz = (w / (2 * pi)) * Fs;% mag2db
Hf_PEAK = 20*log10(abs(H_z));
Hx_PEAK = angle(H_z);figure(1);plot(fz(1:4000), Hf_PEAK(1:4000));
figure(2);plot(fz(1:4000), Hx_PEAK(1:4000));

Magnitude Vs Frequency

OctaveF2M

Phase Vs Frequency

OctaveF2P

C

安装gnuplot

  • msys2环境
pacman -S mingw-w64-x86_64-gnuplot

然后,进入gnuplot互交模式。

gnuplot

注意: 实测无法启动,可能是版本问题。

  • Octave
    gnuplot官网介绍来看,Octave也基于gnuplot绘图。所以可以直接调用Octave的软件包即可。Command Prompt下直接进入gnuplot互交模式。
E:\Ethan\NOTEs\dev\C\Effendi>d:\Octave\Octave-5.2.0\mingw64\bin\gnuplot.exe
int print_freqz(uint32_t frequency, uint32_t order, double a[], double b[])
{double H_z[2]   = {+0.0};double fenzi[2] = {+0,0};double fenmu[2] = {+0,0};double HzAmp  = +0.0;double HzAng  = +0.0;double tmp    = +0.0;double  w;double  hz;int     i;int     j;for (i = 0; i < frequency; i++) {w = (2.0 * M_PI * i) / frequency;fenzi[0] = +0.0;fenzi[1] = +0.0;fenmu[0] = +0.0;fenmu[1] = +0.0;for (j = 0; j <= order; j++) {fenzi[0] = fenzi[0] + b[j] * cos(-j * w); // realfenzi[1] = fenzi[1] + b[j] * sin(-j * w); // imagfenmu[0] = fenmu[0] + a[j] * cos(-j * w); // realfenmu[1] = fenmu[1] + a[j] * sin(-j * w); // imag}tmp = fenmu[0] * fenmu[0] + fenmu[1] * fenmu[1];H_z[0] = (fenzi[0] * fenmu[0] + fenzi[1] * fenmu[1]) / tmp;H_z[1] = (fenzi[1] * fenmu[0] - fenzi[0] * fenmu[1]) / tmp;HzAmp = sqrt(H_z[0] * H_z[0] + H_z[1] * H_z[1]);HzAng = atan(H_z[1] / H_z[0]);if(H_z[1] > 0 & H_z[ 0 ] < 0) HzAng = HzAng + M_PI;if(H_z[1] < 0 & H_z[ 0 ] < 0) HzAng = HzAng - M_PI;hz = (w / (2 * M_PI)) * frequency;printf("%e\t%e\t%e\n", hz, 20 * log10(HzAmp), HzAng);}return 0;
}
./Effendi.exe freqz -o 2 -f 48000 -c +1.000000:-1.973835:+0.990867:+1.009874:-1.973835:+0.980993 > freqz.tx

gnuplot互交模式下。

gnuplot> plot [0:4000] [-2:10] "freqz.txt" u 1:2 w l
gnuplot> plot [0:4000] [-0.8:0.8] "freqz.txt" u 1:3 w l

Magnitude Vs Frequency

gnuplotF2M

Phase Vs Frequency

gnuplotF2P


http://chatgpt.dhexx.cn/article/EKA6rdmc.shtml

相关文章

数字信号处理FIR滤波器实验

目录 一、题目介绍以及函数准备 二、程序源代码以及图像 三、思考 为何线性相位是一个来回往返的折线形&#xff1f; 一、题目介绍以及函数准备 要求设计一个线性相位FIR数字低通滤波器来对模拟信号进行滤波&#xff0c; 技术要求为fp4kHz&#xff0c;fst4.5kHz&#xff0c…

绘制系统响应函数的频率响应曲线

在z变换中&#xff0c;对于系统响应函数H(z) 绘制频率响应曲线 注意点&#xff1a; 绘制零极点图的函数 zplane(B,A);%%B为分母的系数矩阵 A为分子的系数矩阵 第一个数为z^0 第二个数为z^-1的系数 以此类推 freqz(B,A) %%计算频率响应H(e^jw) angle(H) %% 绘制相频响应 …

freqz()计算M点滑动平均滤波器的频率响应

函数说明&#xff08;建议参考官方文档&#xff09; freqz(h,w)可以用来求指定的单位脉冲响应向量 h 在一组给定频率点 w 上的频率响应值由这些频率响应值&#xff0c;可以用函数 real 和 imag 计算实部和虚部&#xff0c;函数 abs 和 angle 计算幅度和相位M 点滑动平均滤波器…

matlab freqz函数使用

Matlab freqz函数使用 (2012-10-22 13:42:03) 转载▼ 标签&#xff1a; 杂谈 freqz函数计算线性系统的频率响应,包括幅频响应和相频响应,基本输入为线性系统的AMMA模型系数向量,一个典型的AMMA模型为 % jw -jw -jmw % jw B(e) …

MATLAB——IIR数字滤波器的设计

1.基础知识 1.1、数字滤波器设计的基本步骤 我们知道模拟滤波器的设计是数字滤波器的设计的基础。在学习数字信号处理的过程中&#xff0c;IIR数字滤波器的设计的步骤是 &#xff08;1&#xff09;确定采样间隔Ts或者采样频率fs。 &#xff08;2&#xff09;根据模拟频率和数字…

Matlab的freqz()函数和窗函数法fir1()一起使用

窗函数法设计FIRDF使用Matlab的fir1&#xff08;&#xff09;函数十分方便&#xff0c;DSP课堂上已经讲过&#xff0c;此处不再赘述。关心的是&#xff1a; 使用 hn fir1&#xff08;M&#xff0c; wc&#xff09;&#xff1b;%M为滤波器阶数M&#xff0c;长度N&…

matlab filter freqz

1.滤波函数filter 利用滤波器H(Z)b/a&#xff0c;对X滤波 ba为向量 滤波器传输函数H&#xff08;Z&#xff09;的分子分母&#xff1a;b,a 利用b&#xff0c;a表征H即滤波器 2.freqz Hb/a&#xff0c;由b和a提取H和数字角频率w 2.1[h,w] freqz(b,a,n) n默认512&#xff0…

matlab:<三>freqz函数

【转载:博客】 一 函数调用介绍 MATLAB提供了专门用于求离散系统频响特性的函数freqz()&#xff0c;调用freqz()的格式有以下几种&#xff1a; (1)[H,w]freqz(B,A,N); %N默认值为512 (2)[H,w]freqz(B,A,N,whole); (3)[H,w]freqz(B,A,[自定义区间]); 上式中B和A分别对应离散系统…

freqz()函数

2、离散系统的频率特性 同连续系统的系统函数H(s)类似,离散系统的系统函数H(z)也反映了系统本身固有的特性。对于离散系统来说,如果把其系统函数H(z)中的复变量z换成,那么所得的函数就是此离散系统的频率响应特性,即离散时间系统的频率响应为: 其中, 称为离散系统的幅频…

信号与系统 实验四:信号与系统复频域分析(2 学时)

注明&#xff1a;这是学校专业课实验&#xff0c;利用网站做一个学习和记录。有错的地方希望好心人指点一下。 一、实验目的 1.学会用 MATLAB 进行部分分式展开&#xff1b; 2.学会用 MATLAB 分析 LTI 系统的特性&#xff1b; 3.学会用 MATLAB 进行 Laplace 正、反变换。…

MATLAB中freqz函数的用法

本文引用自乱七八糟 《MATLAB中freqz函数的用法》 FREQZ 是计算数字滤波器的频率响应的函数 [H,W] FREQZ(B,A,N)returns the N-point complex frequency response vector H and the N-point frequency vector W in radians/sample of the filter: 函数的输出&#xff1a;a.滤波…

fft和freqz的区别

http://www.ilovematlab.cn/thread-245794-1-1.html 最近在研究matlab画频谱图&#xff0c;在查找资料过程&#xff0c;在matlab中文论坛中看到一篇帖子&#xff0c;感觉比较有用&#xff0c;简单整理了一下。 一、FFT函数 假设原始信号为x&#xff0c;则fft_xabs(fft(x))得…

MATLAB R2021a无法识别freqz_m

MATLAB R2021a中能识别的函数是freqz&#xff0c;但是无法识别freqz_m函数。 方法一&#xff1a; 若只想了解图像趋势&#xff0c;可以直接用freqz函数替代freqz_m函数&#xff0c;因为freqz_m函数可以有多个输出&#xff0c;但是freqz函数只有两个&#xff0c;所以可以分次进…

【matlab】freqz函数的使用(二)

freqz函数计算线性系统的频率响应,包括幅频响应和相频响应,基本输入为线性系统的AMMA模型系数向量,一个典型的AMMA模型为 % jw -jw -jmw % jw B(e) b(1) b(2)e .... b(m1)e % H(e) ---- -----------------------…

freqz()

实函数的傅里叶变换的幅度谱是偶函数&#xff0c;其相位谱为奇函数。这一特性在信号分析中得到广泛应用。 离散系统频响特性的函数freqz() [H&#xff0c;W ] freqz&#xff08;b&#xff0c;a&#xff0c;n&#xff09;返回量H则包含了离散系统频响在 0~pi范围内N个频率等分点…

MATLAB函数freqz的使用

(一)、它是数字滤波器的频率响应&#xff08;包括幅频响应和相频响应&#xff09; &#xff08;二&#xff09;、主要的形式&#xff1a; [h,w] freqz(b,a,n)[h,w] freqz(sos,n)[h,w] freqz(d,n)[h,w] freqz(___,n,whole)[h,f] freqz(___,n,fs)[h,f] freqz(___,n,whole…

频率响应说明

目录 数字域 模拟域 数字域 freqz 使用基于 FFT 的算法来计算数字滤波器的 Z 变换频率响应。具体来说&#xff0c;语句 [h,w] freqz(b,a,p) 返回数字滤波器的包含 p 个点的复频率响应 在其最简单的形式中&#xff0c;freqz 接受滤波器系数向量 b 和 a 以及整数 p&#xf…

详解MATLAB之freqz()函数

一 函数调用介绍 MATLAB提供了专门用于求离散系统频响特性的函数freqz()&#xff0c;调用freqz()的格式有以下几种&#xff1a; (1)[H,w]freqz(B,A,N); %N默认值为512 (2)[H,w]freqz(B,A,N,whole); (3)[H,w]freqz(B,A,[自定义区间]); 上式中B和A分别对应离散系统的系统函…

Matlab中freqz函数使用

目录 语法 输入参数 输出参数 说明 示例 传递函数的频率响应 二阶部分的频率响应 FIR滤波器的频率响应 FIR带通滤波器的频率响应 freqz函数是求解数字滤波器的频率响应。 语法 [h,w] freqz(b,a,n)[h,w] freqz(sos,n)[h,w] freqz(d,n)[h,w] freqz(___,n,whole)[h…

计算机网络实验三 rdt协议

实验目的 熟悉各种不同 rdt 协议的运行环境,对照教材理解给出的 rdt 协议源码,理解并掌握不同链路特性对 rdt 协议性能的影响。比较不同 rdt 协议适应的运行环境。 准备阶段 进入Linux操作系统,将实验文件复制到Ubuntu内,观察到文件内包含Makefile文件,于是在命令行内将…