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

锁相放大器,数字锁相放大器.C和python版的源代码

数字锁相放大器.
锁相放大器, 它是一种可以从高噪声环境中提取出特定频率信号的放大器,工作原理主要是利用正弦函数的正交性进行信号的相位检测和幅值测量。如果你对锁相放大器感兴趣,我可以给你更详细的解释。

数字锁相放大器是利用软件算法来实现提取特定频率信号的。这种算法通常使用数字信号处理技术,如快速傅里叶变换(FFT)或数字滤波器,来分析和提取输入信号中的特定频率成分。与传统的模拟锁相放大器相比,数字锁相放大器具有更高的灵活性、精度和稳定性。
以下是一个简单的数字锁相放大器算法的示例,经过验证,输出结果正确.

这个算法使用了乘法和积分操作来提取输入信号中与参考频率相对应的幅度和相位信息。你可以将你的信号数据传递给这个函数,并指定参考频率、采样率和积分时间来获得解调后的幅度和相位。

请注意,这只是一个简单的示例算法,实际应用中可能需要进行更多的优化和调整。此外,数字锁相放大器还有许多其他功能和参数设置,你可以根据具体需求进行进一步的探索和研究。

希望这个示例能帮助你理解数字锁相放大器的基本原理和算法实现!如果你还有其他问题或需要进一步的帮助,请随时告诉我。
使用Python语言实现:

import numpy as npdef digital_lock_in_amplifier(signal, reference_frequency, sampling_rate, integration_time):'''数字锁相放大器@signal 原始信号@reference_frequency 参考频率@sampling_rate 采样率@integration_time 积分时间'''# 计算参考信号的相位reference_phase = 2 * np.pi * reference_frequency * np.arange(len(signal)) / sampling_rate# 生成参考信号的正弦和余弦分量reference_sin = np.sin(reference_phase)reference_cos = np.cos(reference_phase)# 将输入信号与参考信号的正弦和余弦分量相乘multiplied_sin = signal * reference_sinmultiplied_cos = signal * reference_cos# 对乘积进行积分,得到解调后的信号demodulated_sin = np.mean(multiplied_sin) * integration_timedemodulated_cos = np.mean(multiplied_cos) * integration_time# 计算解调后信号的幅度和相位amplitude = np.sqrt(demodulated_sin**2 + demodulated_cos**2)phase = np.arctan2(demodulated_sin, demodulated_cos)return amplitude, phaseimport numpy as np
import matplotlib.pyplot as plt# 设置信号参数
sampling_rate = 1000  # 采样率(Hz)
duration = 1  # 信号持续时间(秒)
frequencies = [10, 60, 100]  # 信号中的频率成分(Hz)
amplitudes = [1, 0.1, 0.25]  # 对应频率成分的幅度
phases = [0, np.pi/4, np.pi/2]  # 对应频率成分的相位(弧度)
print("phases",np.pi/4)
# 生成时间轴
t = np.arange(0, duration, 1/sampling_rate)# 初始化信号
signal = 0# 叠加各个频率成分
for freq, amp, phase in zip(frequencies, amplitudes, phases):# 生成对应频率的正弦波component = amp * np.sin(2 * np.pi * freq * t + phase)# 叠加到总信号上signal += component#把signal保存成csv文件
np.savetxt('signal1.csv', signal, delimiter=',')
#把signal保存成csv文件
# signal = signal.tolist()
# signal = np.array(signal)
# signal = signal.reshape(-1, 1)
# signal = pd.DataFrame(signal)
# signal.to_csv('signal.csv', index=False, header=False)# 绘制信号波形图
plt.plot(t, signal)
plt.xlabel('Time (s)')
plt.ylabel('Amplitude')
plt.title('Test Signal')
plt.grid(True)
plt.show()amplitude, phase = digital_lock_in_amplifier(signal,60,1000,1)
print("振幅",amplitude * 2)
print("相位",phase)

注意,相位是以弧度为单位的,如果你需要以角度为单位,你可以使用phase * (180.0 / np.pi) 进行转换

下面是C语言版本的, 此版本还未验证. 应该是正确的.

#include <stdio.h>
#include <math.h>
#include <complex.h>typedef double complex cmpx;// 数字锁相放大器算法函数
// 输入:signal - 输入信号数组
//       freq - 锁相放大器的参考频率
//       sampling_rate - 采样率
//       n - 信号数组的长度
// 输出:amplitude - 放大后的信号幅度
//       phase - 放大后的信号相位(弧度制)
void digital_lock_in_amplifier(cmpx *signal, double freq, double sampling_rate, int n, double *amplitude, double *phase) {// 计算参考信号的复数形式cmpx ref_signal = 0;for (int i = 0; i < n; i++) {double time = (double)i / sampling_rate;ref_signal += cos(2 * M_PI * freq * time) + sin(2 * M_PI * freq * time) * I;}ref_signal /= n; // 平均化参考信号// 计算输入信号与参考信号的乘积并求和cmpx product_sum = 0;for (int i = 0; i < n; i++) {product_sum += signal[i] * conj(ref_signal);}// 计算幅度和相位*amplitude = cabs(product_sum); // 幅度*phase = carg(product_sum);     // 相位(弧度制)
}int main() {double freq = 50.0;         // 参考频率(Hz)double sampling_rate = 1000.0; // 采样率(Hz)int n = 1000;               // 信号长度double amplitude, phase;// 分配信号数组cmpx *signal = (cmpx *)malloc(n * sizeof(cmpx));// 填充信号数组(这里用正弦波作为示例)for (int i = 0; i < n; i++) {signal[i] = cos(2 * M_PI * freq * (i / sampling_rate)) + sin(2 * M_PI * freq * (i / sampling_rate)) * I;}// 调用数字锁相放大器算法函数digital_lock_in_amplifier(signal, freq, sampling_rate, n, &amplitude, &phase);// 输出结果printf("The amplitude of the signal at the reference frequency is: %f\n", amplitude);printf("The phase of the signal at the reference frequency is: %f radians\n", phase);// 将相位转换为角度(如果需要)double phase_degrees = phase * (180.0 / M_PI);printf("The phase of the signal at the reference frequency is: %f degrees\n", phase_degrees);// 释放内存free(signal);return 0;
}

在这个代码中,digital_lock_in_amplifier函数现在接受两个额外的指针参数amplitude和phase,用于存储计算出的幅度和相位。cabs函数用于计算复数的幅度,而carg函数用于计算复数的相位角(以弧度为单位)。在main函数中,我们调用digital_lock_in_amplifier函数并打印出计算出的幅度和相位。

相关文章:

锁相放大器,数字锁相放大器.C和python版的源代码

数字锁相放大器. 锁相放大器, 它是一种可以从高噪声环境中提取出特定频率信号的放大器&#xff0c;工作原理主要是利用正弦函数的正交性进行信号的相位检测和幅值测量。如果你对锁相放大器感兴趣&#xff0c;我可以给你更详细的解释。 数字锁相放大器是利用软件算法来实现提取…...

(02)Hive SQL编译成MapReduce任务的过程

目录 一、架构及组件介绍 1.1 Hive底层架构 1.2 Hive组件 1.3 Hive与Hadoop交互过程 二、Hive SQL 编译成MR任务的流程 2.1 HQL转换为MR源码整体流程介绍 2.2 程序入口—CliDriver 2.3 HQL编译成MR任务的详细过程—Driver 2.3.1 将HQL语句转换成AST抽象语法树 词法、语…...

【C++初阶】值得一刷的字符串string相关oj题

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;C航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1…...

《Go 简易速速上手小册》第10章:微服务与云原生应用(2024 最新版)

文章目录 10.1 构建微服务架构 - 探索 Go 语言的微观世界10.1.1 基础知识讲解10.1.2 重点案例&#xff1a;订单处理系统订单服务测试服务 10.1.3 拓展案例 1&#xff1a;用户认证服务安装所需的包实现用户模型和存储实现 JWT 生成和验证实现认证服务测试服务 10.1.4 拓展案例 2…...

代码随想录算法训练营第34天| Leetcode 860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球

文章目录 Leetcode 860.柠檬水找零Leetcode 406.根据身高重建队列Leetcode 452. 用最少数量的箭引爆气球 Leetcode 860.柠檬水找零 题目链接&#xff1a;Leetcode 860.柠檬水找零 题目描述&#xff1a; 在柠檬水摊上&#xff0c;每一杯柠檬水的售价为 5 美元。顾客排队购买你的…...

数据结构~二叉树(基础知识)

上一篇博客我们对树有了初步了解与学习&#xff0c;这篇我将初步学习二叉树&#xff01;&#xff01;&#xff08;新年快乐&#xff01;&#xff09; 目录 二叉树 1、定义&#xff1a; 2、特点&#xff1a; 3、基本形态&#xff1a; 4、二叉树的种类&#xff1a; &…...

AI大模型学习笔记之四:生成式人工智能(AIGC)是如何工作的?

OpenAI 发布 ChatGPT 已经1年多了&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;也已经广为人知&#xff0c;我们常常津津乐道于 ChatGPT 和 Claude 这样的人工智能系统能够神奇地生成文本与我们对话&#xff0c;并且能够记忆上下文情境。 Midjunery和DALLE 这样的AI…...

bat脚本 创建计划任务 一分钟设置ntp同步周期为60s

要在Windows中使用批处理脚本&#xff08;.bat&#xff09;创建一个计划任务来每分钟同步一次NTP时间&#xff0c;你可以使用schtasks命令来创建计划任务。下面是一个示例脚本&#xff0c;展示了如何创建这样一个计划任务&#xff1a; echo off set "taskNameSyncNTP"…...

python数据分析numpy基础之mean用法和示例

1 python数据分析numpy基础之mean用法和示例 python的numpy库的mean()函数&#xff0c;用于计算沿指定轴(一个轴或多个轴)的算术平均值。 用法 numpy.mean(a, axisNone, dtypeNone, outNone, keepdims<no value>, *, where<no value>)描述 返回数组元素的平均值…...

微服务学习 | Springboot整合Dubbo+Nacos实现RPC调用

&#x1f3f7;️个人主页&#xff1a;鼠鼠我捏&#xff0c;要死了捏的主页 &#x1f3f7;️系列专栏&#xff1a;Golang全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&…...

只允许访问固定网址,如何让电脑只能上指定的网站

在企业管理中&#xff0c;确保员工在工作时能够专注于指定的任务和资源至关重要。为了实现这一目标&#xff0c;许多企业选择限制员工电脑的访问权限&#xff0c;只允许他们访问固定的网址或网站。 这种策略不仅有助于提高工作效率&#xff0c;还能减少因不当上网行为带来的安全…...

作业帮 x TiDB丨多元化海量数据业务的支撑

导读 作业帮是一家成立于 2015 年的在线教育品牌&#xff0c;致力于用科技手段助力教育普惠。经过近十年的积累&#xff0c;作业帮运用人工智能、大数据等技术&#xff0c;为学生、老师、家长提供学习、教育解决方案&#xff0c;智能硬件产品等。随着公司产品和业务场景越来越…...

文生图提示词:天气条件

天气和气候 --天气条件 Weather Conditions 涵盖了从基本的天气类型到复杂的气象现象&#xff0c;为描述不同的天气和气候条件提供了丰富的词汇。 Sunny 晴朗 Cloudy 多云 Overcast 阴天 Partly Cloudy 局部多云 Clear 清晰 Foggy 雾 Misty 薄雾 Hazy 朦胧 Rainy 下雨 Showers …...

【nginx实践连载-3】发布VSTO应用

要使用 Nginx 发布 VSTO 应用程序&#xff0c;需要将 ClickOnce 发布文件夹部署到 Nginx 服务器上。以下是一些步骤&#xff1a; 将 ClickOnce 发布文件夹复制到 Nginx 服务器上。确认 Nginx 配置文件中有一个指向 ClickOnce 发布文件夹的位置块。确保Nginx 配置文件中启用了 …...

【前端工程化面试题】使用 webpack 来优化前端性能/ webpack的功能

这个题目实际上就是来回答 webpack 是干啥的&#xff0c;你对webpack的理解&#xff0c;都是一个问题。 &#xff08;1&#xff09;对 webpack 的理解 webpack 为啥提出 webpack 是啥 webpack 的主要功能 前端开发通常是基于模块化的&#xff0c;为了提高开发效率&#xff0…...

思迈特再获国家权威认证:代码自主率98.78%

日前&#xff0c;思迈特软件自主研发的商业智能与数据分析软件&#xff08;Smartbi Insight&#xff09;通过中国赛宝实验室&#xff08;工业和信息化部电子第五研究所&#xff09;代码扫描测试&#xff0c;Smartbi Insight V11版本扫描测得代码自主率为98.78%的好成绩&#xf…...

JavaScript排序

直接看代码 <table border"1" cellspacing"0"><thead class"tou"><tr><td>选择按钮</td><td>汽车编号</td><td>汽车图片</td><td>汽车系列名称</td><td>汽车能源</…...

【读书笔记】ICS设备及应用攻击(一)

工控系统通常是由互联设备所构成的大型复杂系统&#xff0c;这些设备包括类似于人机界面&#xff08;HMI&#xff09;、PLC、传感器、执行器以及其他使用协商好的协议进行相互通信的设备。所有交互背后的驱动力都是软件&#xff0c;软件为工控系统中几乎所有部分的运行提供支撑…...

网络原理(HTTP篇)

网络原理HTTP 前言HTTPHTTP的工作流程抓包工具抓取HTTP报文HTTP报文格式 请求报文具体细节首行URLURL的基本格式URL encode 方法 报头(header)HostContent-Length 和 Content-TypeUser-Agent&#xff08;UA&#xff09;RefererCookie&#xff08;重要&#xff09; 前言 如图&a…...

关于油封密封件你了解多少?

油封也称为轴封或旋转轴封&#xff0c;旨在防止设备中的润滑剂泄漏&#xff0c;并防止外部污染物进入机械。它们通常用于泵和电机等旋转设备&#xff0c;在固定部件和移动部件之间提供密封界面。 油封的有效性很大程度上取决于其材料。不同的材料具有不同程度的耐热性、耐压性…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.

ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #&#xff1a…...

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...

django blank 与 null的区别

1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是&#xff0c;要注意以下几点&#xff1a; Django的表单验证与null无关&#xff1a;null参数控制的是数据库层面字段是否可以为NULL&#xff0c;而blank参数控制的是Django表单验证时字…...

c# 局部函数 定义、功能与示例

C# 局部函数&#xff1a;定义、功能与示例 1. 定义与功能 局部函数&#xff08;Local Function&#xff09;是嵌套在另一个方法内部的私有方法&#xff0c;仅在包含它的方法内可见。 • 作用&#xff1a;封装仅用于当前方法的逻辑&#xff0c;避免污染类作用域&#xff0c;提升…...

自然语言处理——文本分类

文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益&#xff08;IG&#xff09; 分类器设计贝叶斯理论&#xff1a;线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别&#xff0c; 有单标签多类别文本分类和多…...