分别用C++和matlab实现RC滤波器增益曲线
但是把,感觉OpenGL画出来的图,下降快一些
算法应该是一致的,只不过没有 1j 这个实部虚部,C++里不会实现 R = 20;
C = 22e-6;
f = logspace(1, 3, 1000);
w = 2*pi*f;
H = 1./(1 + 1j*w*R*C);
gain = abs(H);
semilogx(f, 20*log10(H));
xlabel('Frequency (Hz)');
ylabel('Gain (dB)');
title('Gain Curve of RC Low-Pass Filter');
grid on;
for(int f=0;f<1000;f+=10){
double H,w=2*pi*f;//角频率
H=1./sqrt(1+pow(w*R*C,2));
//double gain=abs(H);
double o=20*log10(H);
cout<<f<<" "<<H<<" "<<o<<endl;
glVertex2d(f/1000.,o);
} 我一般用matlab设计一个需要的曲线,然后得到系数,自己用C代码调用系数。 代洪波 发表于 2025-3-11 18:41
我一般用matlab设计一个需要的曲线,然后得到系数,自己用C代码调用系数。
是的,滤波器的基本模型就那几种,性能的差别反映在系数的不同,只要系数确定,算法部分程序都不用改 数字滤波厉害,不用考虑过度衰减,无须再次放大。 Matlab的现成工具好像只有L,C组成的滤波器,没有RC滤波器的。不知道是不是这样? matlab编写函数运算特别轻松,不需要循环,也天生支持复数和矩阵/向量运算。
本永远的编程小白在2017年DIY网分时,为了算复数微波参量,居然自己编写了复数四则运算函数。现在回想起来,肯定有库函数的,不需要自己折腾。 通义千问给的答案:
% 设计一个简单的RC低通滤波器
R = 1000; % 电阻值 (欧姆)
C = 1e-6; % 电容值 (法拉)
% 计算截止频率
fc = 1 / (2 * pi * R * C);
% 创建传递函数
num = ;
den = ;
sys = tf(num, den);
% 绘制频率响应
bode(sys);
title('RC Low-pass Filter Frequency Response'); dabfxz 发表于 2025-3-13 18:36
通义千问给的答案:
% 设计一个简单的RC低通滤波器
R = 1000; % 电阻值 (欧姆)
C++/OpenGL成功画出了下面的图 本帖最后由 JuncoJet 于 2025-3-14 09:24 编辑
dabfxz 发表于 2025-3-13 18:36
通义千问给的答案:
% 设计一个简单的RC低通滤波器
R = 1000; % 电阻值 (欧姆)
for (int f = 0; f < 100000; f += 10) {
double H, w = 2 * pi * f; // 频率
H = 1. / sqrt(1 + pow(w * R * C, 2));
double o = 20 * log10(H);
Point p;
p.x = f / 1000.;
p.y = o;
vp.push_back(p);
glVertex2d(p.x, p.y);
}
好像不属于上面任何一种
页:
[1]