锁相放大器,数字锁相放大器.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, &litude, &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版的源代码
数字锁相放大器. 锁相放大器, 它是一种可以从高噪声环境中提取出特定频率信号的放大器,工作原理主要是利用正弦函数的正交性进行信号的相位检测和幅值测量。如果你对锁相放大器感兴趣,我可以给你更详细的解释。 数字锁相放大器是利用软件算法来实现提取…...
(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题
👦个人主页:Weraphael ✍🏻作者简介:目前学习C和算法 ✈️专栏:C航路 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞…...
《Go 简易速速上手小册》第10章:微服务与云原生应用(2024 最新版)
文章目录 10.1 构建微服务架构 - 探索 Go 语言的微观世界10.1.1 基础知识讲解10.1.2 重点案例:订单处理系统订单服务测试服务 10.1.3 拓展案例 1:用户认证服务安装所需的包实现用户模型和存储实现 JWT 生成和验证实现认证服务测试服务 10.1.4 拓展案例 2…...
代码随想录算法训练营第34天| Leetcode 860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球
文章目录 Leetcode 860.柠檬水找零Leetcode 406.根据身高重建队列Leetcode 452. 用最少数量的箭引爆气球 Leetcode 860.柠檬水找零 题目链接:Leetcode 860.柠檬水找零 题目描述: 在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的…...
数据结构~二叉树(基础知识)
上一篇博客我们对树有了初步了解与学习,这篇我将初步学习二叉树!!(新年快乐!) 目录 二叉树 1、定义: 2、特点: 3、基本形态: 4、二叉树的种类: &…...
AI大模型学习笔记之四:生成式人工智能(AIGC)是如何工作的?
OpenAI 发布 ChatGPT 已经1年多了,生成式人工智能(AIGC)也已经广为人知,我们常常津津乐道于 ChatGPT 和 Claude 这样的人工智能系统能够神奇地生成文本与我们对话,并且能够记忆上下文情境。 Midjunery和DALLE 这样的AI…...
bat脚本 创建计划任务 一分钟设置ntp同步周期为60s
要在Windows中使用批处理脚本(.bat)创建一个计划任务来每分钟同步一次NTP时间,你可以使用schtasks命令来创建计划任务。下面是一个示例脚本,展示了如何创建这样一个计划任务: echo off set "taskNameSyncNTP"…...
python数据分析numpy基础之mean用法和示例
1 python数据分析numpy基础之mean用法和示例 python的numpy库的mean()函数,用于计算沿指定轴(一个轴或多个轴)的算术平均值。 用法 numpy.mean(a, axisNone, dtypeNone, outNone, keepdims<no value>, *, where<no value>)描述 返回数组元素的平均值…...
微服务学习 | Springboot整合Dubbo+Nacos实现RPC调用
🏷️个人主页:鼠鼠我捏,要死了捏的主页 🏷️系列专栏:Golang全栈-专栏 🏷️个人学习笔记,若有缺误,欢迎评论区指正 前些天发现了一个巨牛的人工智能学习网站,通俗易懂&…...
只允许访问固定网址,如何让电脑只能上指定的网站
在企业管理中,确保员工在工作时能够专注于指定的任务和资源至关重要。为了实现这一目标,许多企业选择限制员工电脑的访问权限,只允许他们访问固定的网址或网站。 这种策略不仅有助于提高工作效率,还能减少因不当上网行为带来的安全…...
作业帮 x TiDB丨多元化海量数据业务的支撑
导读 作业帮是一家成立于 2015 年的在线教育品牌,致力于用科技手段助力教育普惠。经过近十年的积累,作业帮运用人工智能、大数据等技术,为学生、老师、家长提供学习、教育解决方案,智能硬件产品等。随着公司产品和业务场景越来越…...
文生图提示词:天气条件
天气和气候 --天气条件 Weather Conditions 涵盖了从基本的天气类型到复杂的气象现象,为描述不同的天气和气候条件提供了丰富的词汇。 Sunny 晴朗 Cloudy 多云 Overcast 阴天 Partly Cloudy 局部多云 Clear 清晰 Foggy 雾 Misty 薄雾 Hazy 朦胧 Rainy 下雨 Showers …...
【nginx实践连载-3】发布VSTO应用
要使用 Nginx 发布 VSTO 应用程序,需要将 ClickOnce 发布文件夹部署到 Nginx 服务器上。以下是一些步骤: 将 ClickOnce 发布文件夹复制到 Nginx 服务器上。确认 Nginx 配置文件中有一个指向 ClickOnce 发布文件夹的位置块。确保Nginx 配置文件中启用了 …...
【前端工程化面试题】使用 webpack 来优化前端性能/ webpack的功能
这个题目实际上就是来回答 webpack 是干啥的,你对webpack的理解,都是一个问题。 (1)对 webpack 的理解 webpack 为啥提出 webpack 是啥 webpack 的主要功能 前端开发通常是基于模块化的,为了提高开发效率࿰…...
思迈特再获国家权威认证:代码自主率98.78%
日前,思迈特软件自主研发的商业智能与数据分析软件(Smartbi Insight)通过中国赛宝实验室(工业和信息化部电子第五研究所)代码扫描测试,Smartbi Insight V11版本扫描测得代码自主率为98.78%的好成绩…...
JavaScript排序
直接看代码 <table border"1" cellspacing"0"><thead class"tou"><tr><td>选择按钮</td><td>汽车编号</td><td>汽车图片</td><td>汽车系列名称</td><td>汽车能源</…...
【读书笔记】ICS设备及应用攻击(一)
工控系统通常是由互联设备所构成的大型复杂系统,这些设备包括类似于人机界面(HMI)、PLC、传感器、执行器以及其他使用协商好的协议进行相互通信的设备。所有交互背后的驱动力都是软件,软件为工控系统中几乎所有部分的运行提供支撑…...
网络原理(HTTP篇)
网络原理HTTP 前言HTTPHTTP的工作流程抓包工具抓取HTTP报文HTTP报文格式 请求报文具体细节首行URLURL的基本格式URL encode 方法 报头(header)HostContent-Length 和 Content-TypeUser-Agent(UA)RefererCookie(重要) 前言 如图&a…...
关于油封密封件你了解多少?
油封也称为轴封或旋转轴封,旨在防止设备中的润滑剂泄漏,并防止外部污染物进入机械。它们通常用于泵和电机等旋转设备,在固定部件和移动部件之间提供密封界面。 油封的有效性很大程度上取决于其材料。不同的材料具有不同程度的耐热性、耐压性…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
