当前位置: 首页 > 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;在固定部件和移动部件之间提供密封界面。 油封的有效性很大程度上取决于其材料。不同的材料具有不同程度的耐热性、耐压性…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...

rknn toolkit2搭建和推理

安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 &#xff0c;不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源&#xff08;最常用&#xff09; conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...

Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解

文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一&#xff1a;HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二&#xff1a;Floyd 快慢指针法&#xff08;…...

基于江科大stm32屏幕驱动,实现OLED多级菜单(动画效果),结构体链表实现(独创源码)

引言 在嵌入式系统中&#xff0c;用户界面的设计往往直接影响到用户体验。本文将以STM32微控制器和OLED显示屏为例&#xff0c;介绍如何实现一个多级菜单系统。该系统支持用户通过按键导航菜单&#xff0c;执行相应操作&#xff0c;并提供平滑的滚动动画效果。 本文设计了一个…...

SQL进阶之旅 Day 22:批处理与游标优化

【SQL进阶之旅 Day 22】批处理与游标优化 文章简述&#xff08;300字左右&#xff09; 在数据库开发中&#xff0c;面对大量数据的处理任务时&#xff0c;单条SQL语句往往无法满足性能需求。本篇文章聚焦“批处理与游标优化”&#xff0c;深入探讨如何通过批量操作和游标技术提…...