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

2024-02-18 08:44

本文主要是介绍锁相放大器,数字锁相放大器.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版的源代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/720639

相关文章

Python实现终端清屏的几种方式详解

《Python实现终端清屏的几种方式详解》在使用Python进行终端交互式编程时,我们经常需要清空当前终端屏幕的内容,本文为大家整理了几种常见的实现方法,有需要的小伙伴可以参考下... 目录方法一:使用 `os` 模块调用系统命令方法二:使用 `subprocess` 模块执行命令方法三:打印多个换行符模拟

Python实现MQTT通信的示例代码

《Python实现MQTT通信的示例代码》本文主要介绍了Python实现MQTT通信的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 安装paho-mqtt库‌2. 搭建MQTT代理服务器(Broker)‌‌3. pytho

基于Python开发一个图像水印批量添加工具

《基于Python开发一个图像水印批量添加工具》在当今数字化内容爆炸式增长的时代,图像版权保护已成为创作者和企业的核心需求,本方案将详细介绍一个基于PythonPIL库的工业级图像水印解决方案,有需要... 目录一、系统架构设计1.1 整体处理流程1.2 类结构设计(扩展版本)二、核心算法深入解析2.1 自

从入门到进阶讲解Python自动化Playwright实战指南

《从入门到进阶讲解Python自动化Playwright实战指南》Playwright是针对Python语言的纯自动化工具,它可以通过单个API自动执行Chromium,Firefox和WebKit... 目录Playwright 简介核心优势安装步骤观点与案例结合Playwright 核心功能从零开始学习

Python 字典 (Dictionary)使用详解

《Python字典(Dictionary)使用详解》字典是python中最重要,最常用的数据结构之一,它提供了高效的键值对存储和查找能力,:本文主要介绍Python字典(Dictionary)... 目录字典1.基本特性2.创建字典3.访问元素4.修改字典5.删除元素6.字典遍历7.字典的高级特性默认字典

Python自动化批量重命名与整理文件系统

《Python自动化批量重命名与整理文件系统》这篇文章主要为大家详细介绍了如何使用Python实现一个强大的文件批量重命名与整理工具,帮助开发者自动化这一繁琐过程,有需要的小伙伴可以了解下... 目录简介环境准备项目功能概述代码详细解析1. 导入必要的库2. 配置参数设置3. 创建日志系统4. 安全文件名处

使用Python构建一个高效的日志处理系统

《使用Python构建一个高效的日志处理系统》这篇文章主要为大家详细讲解了如何使用Python开发一个专业的日志分析工具,能够自动化处理、分析和可视化各类日志文件,大幅提升运维效率,需要的可以了解下... 目录环境准备工具功能概述完整代码实现代码深度解析1. 类设计与初始化2. 日志解析核心逻辑3. 文件处

python生成随机唯一id的几种实现方法

《python生成随机唯一id的几种实现方法》在Python中生成随机唯一ID有多种方法,根据不同的需求场景可以选择最适合的方案,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习... 目录方法 1:使用 UUID 模块(推荐)方法 2:使用 Secrets 模块(安全敏感场景)方法

使用Python删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数