当前位置: 首页 > news >正文

C#学习之S参数读取(s2p文件)

目录

一、创作灵感

二、S2PFileReader类

1.代码示例

2.代码说明

a.ReadS2PFile 方法:

b.DataTable 结构:

三、S2PFileReader类的调用演示

1.使用示例


一、创作灵感

虽然MATLAB处理数据很实用,但是C#常用于程控仪器的控制,对于射频器件的测试,由于趋肤效应会使得射频同轴线在不同频点具有不同的插入损耗。C#编写的测试平台遍历DUT的不同工作频点需要正确的补偿值,利用C#提前提取出平台射频输入、输出线的插入损耗能减少数据后期的处理工作量。S2P文件可以由矢量网络分析仪事先测量再通过C#编写程序提取并正确补偿到信号源、功率计和频谱仪等仪器中。

二、S2PFileReader类

1.代码示例

以下是一个封装好的类,用于读取 .s2p 文件并将其内容赋值给 DataTable

using System;
using System.Data;
using System.IO;

public class S2PFileReader
{
    /// <summary>
    /// 读取 .s2p 文件并返回 DataTable
    /// </summary>
    /// <param name="filePath">.s2p 文件路径</param>
    /// <returns>包含 .s2p 文件数据的 DataTable</returns>
    public static DataTable ReadS2PFile(string filePath)
    {
        // 创建 DataTable
        DataTable dataTable = new DataTable();
        dataTable.TableName = "S2PData";

        // 添加列
        dataTable.Columns.Add("Frequency", typeof(double)); // 频率
        dataTable.Columns.Add("S11_Magnitude", typeof(double)); // S11 幅度
        dataTable.Columns.Add("S11_Phase", typeof(double));     // S11 相位
        dataTable.Columns.Add("S21_Magnitude", typeof(double)); // S21 幅度
        dataTable.Columns.Add("S21_Phase", typeof(double));     // S21 相位
        dataTable.Columns.Add("S12_Magnitude", typeof(double)); // S12 幅度
        dataTable.Columns.Add("S12_Phase", typeof(double));     // S12 相位
        dataTable.Columns.Add("S22_Magnitude", typeof(double)); // S22 幅度
        dataTable.Columns.Add("S22_Phase", typeof(double));     // S22 相位

        try
        {
            // 读取文件
            using (StreamReader reader = new StreamReader(filePath))
            {
                string line;
                while ((line = reader.ReadLine()) != null)
                {
                    // 跳过注释行(以 ! 或 # 开头的行)
                    if (line.StartsWith("!") || line.StartsWith("#"))
                        continue;

                    // 按空格分割行数据
                    string[] values = line.Split(new[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries);

                    // 确保数据行包含足够的列
                    if (values.Length >= 9)
                    {
                        // 解析数据并添加到 DataTable
                        DataRow row = dataTable.NewRow();
                        row["Frequency"] = double.Parse(values[0]); // 频率
                        row["S11_Magnitude"] = double.Parse(values[1]); // S11 幅度
                        row["S11_Phase"] = double.Parse(values[2]);     // S11 相位
                        row["S21_Magnitude"] = double.Parse(values[3]); // S21 幅度
                        row["S21_Phase"] = double.Parse(values[4]);     // S21 相位
                        row["S12_Magnitude"] = double.Parse(values[5]); // S12 幅度
                        row["S12_Phase"] = double.Parse(values[6]);     // S12 相位
                        row["S22_Magnitude"] = double.Parse(values[7]); // S22 幅度
                        row["S22_Phase"] = double.Parse(values[8]);     // S22 相位
                        dataTable.Rows.Add(row);
                    }
                }
            }
        }
        catch (Exception ex)
        {
            throw new Exception("读取 .s2p 文件时出错: " + ex.Message);
        }

        return dataTable;
    }
}

2.代码说明

a.ReadS2PFile 方法:

读取 .s2p 文件并解析数据。

将频率和 S 参数(幅度和相位)存储到 DataTable 中。

跳过以 ! 或 # 开头的注释行。

b.DataTable 结构:

包含以下列:Frequency(频率)、S11_Magnitude(S11 幅度)、S11_Phase(S11 相位)、S21_Magnitude(S21 幅度)、S21_Phase(S21 相位)、S12_Magnitude(S12 幅度)、S12_Phase(S12 相位)、S22_Magnitude(S22 幅度)、S22_Phase(S22 相位)。

三、S2PFileReader类的调用演示

1.使用示例

调用ReadS2PFile(string filePath)方法,将 .s2p 文件数据绑定到 DataGridView 的示例:

using System;
using System.Data;
using System.Windows.Forms;

public class MainForm : Form
{
    private DataGridView dataGridView1;

    public MainForm()
    {
        InitializeComponent();
    }

    private void InitializeComponent()
    {
        this.dataGridView1 = new DataGridView();
        ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit();
        this.SuspendLayout();

        // 设置 DataGridView
        this.dataGridView1.Dock = DockStyle.Fill;
        this.Controls.Add(this.dataGridView1);

        // 加载 .s2p 文件
        string filePath = "example.s2p"; // 替换为你的 .s2p 文件路径
        try
        {
            DataTable dataTable = S2PFileReader.ReadS2PFile(filePath);
            this.dataGridView1.DataSource = dataTable;
        }
        catch (Exception ex)
        {
            MessageBox.Show("加载文件失败: " + ex.Message);
        }

        ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit();
        this.ResumeLayout(false);
    }

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.Run(new MainForm());
    }
}

相关文章:

  • 如何预防DDOS攻击
  • 多模态本地部署ConVideoX-5B模型文生视频
  • 深入理解 Rust 的迭代器:从基础到高级
  • JZ39 数组中出现次数超过一半的数字 (Boyer-Moore 投票算法)候选法
  • 浮点数的机器码表示
  • linux--关于makefile
  • 白话文实战OpenFeign
  • 基于opencv的 24色卡IQA评测算法源码-可完全替代Imatest
  • SpringBoot 集成 Caffeine 实现本地缓存
  • WPF创建自定义类和控件及打包成dll引用
  • 2.10 Playground Chat提示工程实战:从交互调试到企业级应用的全链路指南
  • 驱动开发、移植(最后的说法有误,以后会修正)
  • 【Apache Paimon】-- 16 -- 利用 paimon-flink-action 同步 kafka 数据到 hive paimon 表中
  • Linux环境下安装mkcert
  • Python--正则表达式
  • SAP-ABAP:SAP中REPORT程序和online程序的区别对比
  • Modbus通讯协议
  • YOLOv5-Seg 完全指南:从训练到后处理
  • 阅读论文笔记《Efficient Estimation of Word Representations in Vector Space》
  • YOLOV8的学习记录(二) yolo8的几个内置模型简介
  • 上市不足一年,吉利汽车拟私有化极氪并合并:整合资源,杜绝重复投入
  • 央行、证监会:科技创新债券含公司债券、企业债券、非金融企业债务融资工具等
  • 央行:增加科技创新和技术改造再贷款额度3000亿元
  • 两次蹚入同一条河,巴萨这一晚被命运抛弃
  • 十四届全国政协原常委、民族和宗教委员会原副主任苟仲文被提起公诉
  • 86岁书画家、美术教育家、吴昌硕嫡裔曾孙吴民先离世