锁相放大器,数字锁相放大器.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: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

从去中心化到智能化:Web3如何与AI共同塑造数字生态

在数字时代的演进中,Web3和人工智能(AI)正成为塑造未来互联网的两大核心力量。Web3的去中心化理念与AI的智能化技术,正相互交织,共同推动数字生态的变革。本文将探讨Web3与AI的融合如何改变数字世界,并展望这一新兴组合如何重塑我们的在线体验。 Web3的去中心化愿景 Web3代表了互联网的第三代发展,它基于去中心化的区块链技术,旨在创建一个开放、透明且用户主导的数字生态。不同于传统

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

usaco 1.2 Name That Number(数字字母转化)

巧妙的利用code[b[0]-'A'] 将字符ABC...Z转换为数字 需要注意的是重新开一个数组 c [ ] 存储字符串 应人为的在末尾附上 ‘ \ 0 ’ 详见代码: /*ID: who jayLANG: C++TASK: namenum*/#include<stdio.h>#include<string.h>int main(){FILE *fin = fopen (

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

nudepy,一个有趣的 Python 库!

更多资料获取 📚 个人网站:ipengtao.com 大家好,今天为大家分享一个有趣的 Python 库 - nudepy。 Github地址:https://github.com/hhatto/nude.py 在图像处理和计算机视觉应用中,检测图像中的不适当内容(例如裸露图像)是一个重要的任务。nudepy 是一个基于 Python 的库,专门用于检测图像中的不适当内容。该

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

HTML提交表单给python

python 代码 from flask import Flask, request, render_template, redirect, url_forapp = Flask(__name__)@app.route('/')def form():# 渲染表单页面return render_template('./index.html')@app.route('/submit_form',