JuncoJet 发表于 2025-3-11 16:41:36

分别用C++和matlab实现RC滤波器增益曲线



但是把,感觉OpenGL画出来的图,下降快一些
算法应该是一致的,只不过没有 1j 这个实部虚部,C++里不会实现

JuncoJet 发表于 2025-3-11 16:44:17

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);
        }

代洪波 发表于 2025-3-11 18:41:03

我一般用matlab设计一个需要的曲线,然后得到系数,自己用C代码调用系数。

iffi123 发表于 2025-3-11 20:00:20

代洪波 发表于 2025-3-11 18:41
我一般用matlab设计一个需要的曲线,然后得到系数,自己用C代码调用系数。

是的,滤波器的基本模型就那几种,性能的差别反映在系数的不同,只要系数确定,算法部分程序都不用改

qyg123 发表于 2025-3-11 20:37:25

数字滤波厉害,不用考虑过度衰减,无须再次放大。

dabfxz 发表于 2025-3-11 20:38:46

Matlab的现成工具好像只有L,C组成的滤波器,没有RC滤波器的。不知道是不是这样?

量子隧道 发表于 2025-3-11 22:48:52

matlab编写函数运算特别轻松,不需要循环,也天生支持复数和矩阵/向量运算。
本永远的编程小白在2017年DIY网分时,为了算复数微波参量,居然自己编写了复数四则运算函数。现在回想起来,肯定有库函数的,不需要自己折腾。

dabfxz 发表于 2025-3-13 18:36:31

通义千问给的答案:
% 设计一个简单的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');

JuncoJet 发表于 2025-3-13 22:18:30

dabfxz 发表于 2025-3-13 18:36
通义千问给的答案:
% 设计一个简单的RC低通滤波器
R = 1000; % 电阻值 (欧姆)


C++/OpenGL成功画出了下面的图

JuncoJet 发表于 2025-3-14 09:22:52

本帖最后由 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]
查看完整版本: 分别用C++和matlab实现RC滤波器增益曲线