乘波前行的问题

1.问题:

考虑两个信号叠加在一起,比如,一个是工频信号50Hz,一个是叠加的高频信号比如有3KHz,简单起见,两个信号都是幅值固定的标准的正弦波,现在我们期望得到那个高频信号,相对工频信号的相对时域波形,它会是什么样的?它的幅值会抖动吗?它会发生类似红移的效应吗?你怎么验算这个操作?

2.尝试构建数学公式

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# paramsIn => resultOut 
#
import json
import binascii
import numpy as np;
import sys
import struct
import numpy as np
import matplotlib.pyplot as plt
import signal_2048_two_sin# 绘制信号和包络
def showTwoPairSignals(t, x, spectrum_before, amplitude_envelope, spectrum_after, freqScale, fs):freq = np.arange(0, 1024*(10000.0/2048), 10000.0/2048)fig, axs = plt.subplots(2, 2, figsize=(10, 8))axs[0, 0].plot(t, x)axs[0, 0].set_xlabel('Time (s)')axs[0, 0].set_ylabel('Amplitude')axs[0, 0].set_title('Original Signal')axs[1, 0].plot(freq, spectrum_before)axs[1, 0].set_xlabel('Frequency (Hz)')axs[1, 0].set_ylabel('Amplitude')axs[1, 0].set_title('Spectrum Before Transformation')axs[1, 0].set_xlim(0, fs/2)axs[0, 1].plot(t, amplitude_envelope)axs[0, 1].set_xlabel('Time (s)')axs[0, 1].set_ylabel('Amplitude')axs[0, 1].set_title('Amplitude Envelope')axs[1, 1].plot(freq, spectrum_after)axs[1, 1].set_xlabel('Frequency (Hz)')axs[1, 1].set_ylabel('Amplitude')axs[1, 1].set_title('Spectrum After Transformation')axs[1, 1].set_xlim(0, fs/2)plt.tight_layout()plt.show()def calc_envelope(fft_complex_result, scale_fft, center_fft, zoomOfFreq):print(len(fft_complex_result))data_array = fft_complex_result;center_freq = center_fft/scale_fft;zoomOfFreq = zoomOfFreq/scale_fft;#频谱进行数字带通滤波min_freq = center_freq - zoomOfFreq;max_freq = center_freq + zoomOfFreq;if(min_freq <0): min_freq = 0;if(max_freq>=(len(data_array)//2)): max_freq =len(data_array)//2;for i in range(len(data_array)//2): #注意data_array包含对称的频谱。if(i<min_freq): data_array[i] = 0+0j;data_array[-1*i] = 0+0j;else:if(i>max_freq): data_array[i] = 0+0j;data_array[-1*i] = 0+0j;#no else# 幅角变换X = data_array;phase_shift = np.zeros(len(X))for idx in np.arange(0, len(X)//2):phase_shift[idx] = -np.angle(X[-idx])X_corrected = X * np.exp( 1j * phase_shift)# 转回时域sampleDataFilted  = np.real(np.fft.ifft(X_corrected)); #我不知道为什么不取abs,但是既有的电机时域数据去零点的结果是正确的。amplitude_spectrum = [(abs(x)/len(sampleDataFilted)) for x in sampleDataFilted]amplitude_spectrum = np.clip(amplitude_spectrum, 0, 65535).astype(np.uint16)# 傅里叶变换X_of_Envelope = np.fft.fft(amplitude_spectrum)  # 计算原始信号的傅里叶变换X_of_Envelope = X_of_Envelope[:len(X_of_Envelope)//2]absFFTOfEnvelope = [abs(item)/len(X_of_Envelope) for item in X_of_Envelope];# to hex again # 将浮点数组转换为 2 字节uint16编码的二进制数据ba = amplitude_spectrum.tobytes()hex_data = binascii.hexlify(ba).decode('utf-8')root = {'binData':hex_data,'pt':len(hex_data)/2/2, #hex=>byte /2 byte=>uint16 /2'byte_len': len(hex_data),'scale': (scale_fft*(len(hex_data)/2))}# out put  json obj: root is ready # it should turn into str => python variable: resultOut######################################################################################## json => strjson_string = json.dumps(root)print(json_string);resultOut = json_string;return (json_string, amplitude_spectrum, absFFTOfEnvelope);(signal, FFT_result, FFT_abs) = signal_2048_two_sin.genSignal(2048, 2000, 1800)
(envelopeHex, envelope_result, absFFTOfEnvelope) = calc_envelope(FFT_result, 10000/2048., 2000, 250);
print(envelope_result)showTwoPairSignals(np.arange(0, 2048.0/10000, 1/10000), signal, FFT_abs[:len(FFT_abs)//2], envelope_result, absFFTOfEnvelope, 10000.0/2048, 10000.0)#其中:signal_2048_two_sin.genSignal(2048, 2000, 1800)的代码参见下文

import math
import wave
import struct
import numpy as np
import matplotlib.pyplot as pltdef genSignal(pt, freq1, freq2):# 采样率和采样点数sample_rate = 10000num_samples = 2048# 信号频率和振幅frequency_1 = freq1frequency_2 = freq2amplitude = 0.5# 计算每个采样点的时间间隔time_interval = 1 / sample_rate# 初始化采样点列表samples = []signal = []# 生成采样点for i in range(num_samples):t = i * time_intervalvalue = amplitude * math.sin(2 * math.pi * frequency_1 * t) + amplitude * math.sin(2 * math.pi * frequency_2 * t)scaled_value = round(value * 32767)  # 缩放到S16范围if(scaled_value>=32767):scaled_value = 32767if(scaled_value<=-32767):scaled_value = 32767signal.append(scaled_value)samples.append(struct.pack('<h', scaled_value))  # 打包为16位整数,并添加到采样点列表# 保存到WAV文件wave_file = wave.open('output.wav', 'wb')wave_file.setnchannels(1)wave_file.setsampwidth(2)wave_file.setframerate(sample_rate)wave_file.writeframes(b''.join(samples))wave_file.close()t = np.arange(0, len(signal));fig = plt.figure(1, figsize=(8, 10));plt1 = fig.add_subplot(2, 1, 1)plt1.plot(t,signal)plt1.set_xlabel('Time (s)')plt1.set_ylabel('Amplitude')plt1.set_title('Original Signal')# 傅里叶变换X = np.fft.fft(signal)  # 计算原始信号的傅里叶变换freq = np.arange(0,len(X))absFFT = [abs(item) for item in X]; #*2/len(X)plt2 = fig.add_subplot(2, 1, 2)plt2.plot(freq, absFFT)plt2.set_xlabel('Freq (?Hz)')plt2.set_ylabel('Amplitude')plt2.set_title('FFT')fig.show()return (signal, X, absFFT);

2.1实际显示效果:

原始波形在左侧,右侧的时域波形似乎完全不对,它应该频率很低才对。但是频谱显示,右侧的峰线确实在左移。我错在哪里了?

上面那个滤波处理,我没有选高通滤波,而是企图直接抹掉频域的一根根谱线,此时的幅角变换我弄错了,对吧? 

2.1 幅角变换的原则

刚刚了解到一点,如果你直接操作谱线,你需要保证原有的谱线之间的相位关系,保持不变。因为FFT的结果未截断前呈现对称性。所以,你如果改了第0条谱线,你需要把FFT结果中,倒数第一条谱线做同步修改。

2.2 高频信号同步红移的物理意义

现在我们打算做这个操作:

1.我们把高频谱线完全左移到0Hz,然后此时,我们看到的波形,物理意义是什么?

考虑机械振动问题。你对时域采样按某个采样率采样后。这是不是意味着,你达到了更改采样率的目的?同时还滤掉了信号的低频分量?近似于标题的乘波?我们看看那样做的效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/171389.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Royal TSX v6.0.1

Royal TSX是一款基于插件的软件&#xff0c;适用于Windows系统&#xff0c;可以用于远程连接和管理服务器。它支持多种连接类型&#xff0c;如RDP、VNC、基于SSH连接的终端&#xff0c;SFTP/FTP/SCP或基于Web的连接管理。 在安装Royal TSX后&#xff0c;需要进行一些基础配置&…

2023人形机器人行业海外科技研究:从谷歌看机器人大模型进展

今天分享的是人形机器人系列深度研究报告&#xff1a;《2023人形机器人行业海外科技研究&#xff1a;从谷歌看机器人大模型进展》。 &#xff08;报告出品方&#xff1a;华鑫证券&#xff09; 报告共计&#xff1a;26页 大模型是人形机器人的必备要素 长期来看&#xff0c;人…

openEuler 22.03 LTS x86_64 cephadm 部署ceph 16.2.14 未完成 笔记

环境 准备三台虚拟机 10.47.76.94 node-1 10.47.76.95 node-2 10.47.76.96 node-3 下载cephadm [rootnode-1 ~]# yum install cephadm Last metadata expiration check: 0:11:31 ago on Tue 21 Nov 2023 10:00:20 AM CST. Dependencies resolved. Package …

数据结构(超详细讲解!!)第二十五节 线索二叉树

1.线索二叉树的定义和结构 问题的提出&#xff1a; 通过遍历二叉树可得到结点的一个线性序列&#xff0c;在线性序列中&#xff0c;很容易求得某个结点的直接前驱和后继。但是在二叉树上只能找到结点的左孩子、右孩子&#xff0c;结点的前驱和后继只有在遍历过程中才能得到…

Alfred v5.1.4(mac快速启动)

Mac效率办公软件哪个好&#xff1f;Alfred是一款Mac电脑上的快速启动和工作流自动化工具&#xff0c;它可以帮助用户快速访问文件、应用程序、web搜索和系统工具&#xff0c;提高工作效率。以下是Alfred的特点&#xff1a; 快速启动&#xff1a;用户可以通过Alfred快速启动应用…

Node.js入门指南(四)

目录 express框架 express介绍 express使用 express路由 express 响应设置 中间件 路由模块化 EJS 模板引擎 express-generator hello&#xff0c;大家好&#xff01;上一篇文章我们介绍了Node.js的模块化以及包管理工具等知识&#xff0c;这篇文章主要给大家分享Nod…

车载通信架构 —— 传统车内通信网络MOST总线(光纤传输、专精多媒体)

车载通信架构 —— 传统车内通信网络MOST总线(光纤传输、专精多媒体) 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都…

(2023码蹄杯)省赛(初赛)第三场真题(原题)(题解+AC代码)

题目1&#xff1a;MC0227堆煤球 码题集OJ-堆煤球 (matiji.net) 思路&#xff1a; 1.i从l枚举到r,i是8的倍数就跳过&#xff0c;i不是8的倍数就用等差数列求和公式i(1i)/2,最后累加到答案中即可 AC_Code:C #include<bits/stdc.h> using namespace std;int main( ) {in…

轻松实现文件按数量平均分类,高效整理并自动新建文件夹保存“

你是否曾经因为文件数量过多&#xff0c;整理起来繁琐而感到烦恼&#xff1f;是否曾经为了新建文件夹而手动一个一个进行创建&#xff0c;费时又费力&#xff1f;现在&#xff0c;我们的智能文件管理工具将为你解决这些问题&#xff01; 首先第一步&#xff0c;我们要进入文件…

【开源】基于Vue.js的网上药店系统

项目编号&#xff1a; S 062 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S062&#xff0c;文末获取源码。} 项目编号&#xff1a;S062&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 药品类型模块2.3 药…

聊一聊索引覆盖的好处

问&#xff1a;索引覆盖啥意思&#xff1f; 答&#xff1a;若查询的字段在二级索引的叶子节点中&#xff0c;则可直接返回结果&#xff0c;无需回表。这种通过组合索引避免回表的优化技术也称为索引覆盖&#xff08;Covering Index&#xff09;。在叶子节点中的包括索引字段和主…

DataGrip 2023.2.3(IDE数据库开发)

DataGrip是一款数据库集成开发环境&#xff08;IDE&#xff09;&#xff0c;用于数据库管理和开发。 DataGrip提供了许多强大的功能&#xff0c;如SQL语句编辑、数据库连接管理、数据导入和导出、数据库比较和同步等等。它支持多种数据库&#xff0c;如MySQL、PostgreSQL、Ora…

Unity技美35——再URP管线环境下,配置post后期效果插件(post processing)

前两年在我的unity文章第10篇写过&#xff0c;后效滤镜的使用&#xff0c;那时候大部分项目用的还是unity的基础管线&#xff0c;stander管线。 但是现在随着unity的发展&#xff0c;大部分项目都用了URO管线&#xff0c;甚至很多PC端用的都是高效果的HDRP管线&#xff0c;这就…

位图及有关海量数据处理

bitset 1.给40亿个不重复的无符号整数&#xff0c;没排过序&#xff0c;给一个无符号整数&#xff0c;如何快速判断一个数是否在这40亿个中 ①.如果用排序加二分查找&#xff0c;40亿个数需要16g内存&#xff0c;内存开不出这么大连续空间 ②.每个值映射一个比特位&#xff0c;…

基于Haclon的图形镜像案例

项目要求&#xff1a; 图为HALCON的例图“green-dot”&#xff0c;请将其中的圆形图案按水平和垂直两个方向分别进行镜像。 项目知识&#xff1a; 首先要用BLOB分析的方法&#xff0c;得到圆形图案的目标区域&#xff0c;再对其进行镜像。 在HALCON中与镜像相关的算子为mirr…

基于Eclipse+Swing+MySQL开发的借贷平台

基于Swing的借贷平台 项目介绍&#x1f481;&#x1f3fb; 本项目是一个基于Java JDBC的银行管理系统。开发环境为MyEclipse2014&#xff0c;数据库使用MySQL V5.5&#xff0c;操作系统为Windows 7 64位。 主要功能包括用户开户、存款、取款、转账、查询余额、修改密码和销户等…

两巨头Facebook 和 GitHub 联手推出 Atom-IDE

9月13日&#xff0c;GitHub 宣布与 Facebook 合作推出了 Atom-IDE —— 它包括一系列将类 IDE 功能带到 Atom 的可选工具包。初次发布的版本包括更智能、感知上下文的自动完成&#xff1b;导航功能&#xff0c;如大纲视图和定义跳转(outline view and goto-definition)&#xf…

生态对对碰|华为OceanStor闪存存储与OceanBase完成兼容性互认证!

近日&#xff0c;北京奥星贝斯科技有限公司 OceanBase 数据库与华为技术有限公司 OceanStor Dorado 全闪存存储系统、OceanStor 混合闪存存储系统完成兼容性互认证。 OceanBase 数据库挂载 OceanStor 闪存存储做为数据盘和日志盘&#xff0c;在 OceanStor 闪存存储系统卓越性能…

css优化滚动条样式

css代码&#xff1a; ::-webkit-scrollbar {width: 6px;height: 6px; }::-webkit-scrollbar-track {background-color: #f1f1f1; }::-webkit-scrollbar-thumb {background-color: #c0c0c0;border-radius: 3px; }最终样式&#xff1a;

TPLink-Wr702N 通过OpenWrt系统打造打印服务器实现无线打印

最近淘到了一个TPLink-Wr702N路由器&#xff0c;而且里面已经刷机为OpenWrt系统了&#xff0c;刚好家里有一台老的USB打印机&#xff0c;就想这通过路由器将打印机改为无线打印机&#xff0c;一番折腾后&#xff0c;居然成功了&#xff0c;这里记录下实现过程&#xff0c;为后面…