乘波前行的问题

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 => str
    json_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 plt


def genSignal(pt, freq1, freq2):
    # 采样率和采样点数
    sample_rate = 10000
    num_samples = 2048

    # 信号频率和振幅
    frequency_1 = freq1
    frequency_2 = freq2
    amplitude = 0.5

    # 计算每个采样点的时间间隔
    time_interval = 1 / sample_rate

    # 初始化采样点列表
    samples = []
    signal = []
    # 生成采样点
    for i in range(num_samples):
        t = i * time_interval
        value = 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 = 32767
        if(scaled_value<=-32767):
            scaled_value = 32767
        signal.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实际显示效果:

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux 网络通信

(一)套接字Socket概念 Socket 中文意思是“插座”&#xff0c;在 Linux 环境下&#xff0c;用于表示进程 x 间网络通信的特殊文件 类型。本质为内核借助缓冲区形成的伪文件。 既然是文件&#xff0c;那么理所当然的&#xff0c;我们可以使用文件描述符引用套接字。Linux 系统…

【MATLAB源码-第88期】基于matlab的灰狼优化算法(GWO)的栅格路径规划,输出做短路径图和适应度曲线

操作环境&#xff1a; MATLAB 2022a 1、算法描述 灰狼优化算法&#xff08;Grey Wolf Optimizer, GWO&#xff09;是一种模仿灰狼捕食行为的优化算法。灰狼是群居动物&#xff0c;有着严格的社会等级结构。在灰狼群体中&#xff0c;通常有三个等级&#xff1a;首领&#xff…

聊一聊索引覆盖的好处

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

Python之内置函数和模块

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

4/5G互操作 EPSFB讲解

今天我们来讲一下4/5G之间之间互操作&#xff0c;以及5G的EPSFB是基于什么实现的~ 目录 4/5G互操作 重选 切换 基于覆盖的切换 基于业务的切换 两个面试问题 想要加快4G切换5G的速度&#xff0c;调哪个参数怎么调高效&#xff1f; 想要减慢5G切换4G的速度调哪个参数怎…

嵌入式硬件电路·电平

目录 1. 电平的概念 1.1 高电平 1.2 低电平 2. 电平的使用场景 2.1 高电平使能 2.2 低电平使能 2.3 失能 1. 电平的概念 电平是指电信号电压的大小或高低状态。在数字电子学中&#xff0c;电平有两种状态&#xff0c;高电平和低电平&#xff0c;用来表示二进制中…

Python之基础语法和六大数据类型

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

C++ 数据结构之-最小栈(MinStack)

最小栈 最小栈&#xff08;Min Stack&#xff09;是一个支持常数时间复杂度获取栈中最小元素的特殊栈数据结构。通常&#xff0c;标准的栈数据结构只支持在常数时间内执行入栈&#xff08;push&#xff09;和出栈&#xff08;pop&#xff09;操作&#xff0c;但无法在常数时间内…

机器学习基础Matplotlib绘图

一、运行环境 学习工具&#xff1a;jupyter-notebookpython版本&#xff1a;311系统&#xff1a;Win11 二、什么是matplotlib&#xff1f; matplotlib是基于python生态开发的一个可视化绘图库&#xff0c;它的出现让python在数据分析及机器学习方面占了重要的一部分&#…

尺度为什么是sigma?

我们先看中值滤波和均值滤波。 以前&#xff0c;我认为是一样的&#xff0c;没有区分过。 他们说&#xff0c;均值滤波有使图像模糊的效果。 中值滤波有使图像去椒盐的效果。为什么不同呢&#xff1f;试了一下&#xff0c;果然不同&#xff0c;然后追踪了一下定义。 12345&…

论文笔记:详解NEUPSL DSI

《Using Domain Knowledge to Guide Dialog Structure Induction via Neural Probabilistic 》 名词解释 Dialog Structure Induction&#xff08;DSI&#xff09;是推断给定目标导向对话的潜在对话结构&#xff08;即一组对话状态及其时间转换&#xff09;的任务。它是现代对…

Typescript基础面试题 | 02.精选 ts 面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

Qt手写ListView

创建视图&#xff1a; QHBoxLayout* pHLay new QHBoxLayout(this);m_pLeftTree new QTreeView(this);m_pLeftTree->setEditTriggers(QAbstractItemView::NoEditTriggers); //设置不可编辑m_pLeftTree->setFixedWidth(300);创建模型和模型项&#xff1a; m_pLeftTree…

STM32 SCF文件

文章目录 1 SCF文件2 SCT分散加载文件3 SCF文件编写 1 SCF文件 keil编译器在链接的时候&#xff0c;是根据分散加载(.scf后缀的文件)来确定程序的加载域和运行域的。 加载域就是程序运行前在flash中具体分区情况执行域就是程序运行后&#xff0c;程序在flash和ram中的分区情况…

【5G PHY】5G SS/PBCH块介绍(四)

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

leetcode中“辅助栈”类题目和“单调栈”类题目的异同

1 总结 1 栈中元素的特性 2 单调栈存在一次性连续删除多个栈顶的情况&#xff0c;但是普通的栈&#xff0c;一次只pop掉一个栈顶元素 2 LC1209. 删除字符串中的所有相邻重复项 II - 普通辅助栈 class Solution {public String removeDuplicates(String s, int k) {int ns.l…

windows的bat文件(学习笔记)

简介 通过windows的cmd执行的批处理&#xff0c;扩展名可以是.bat或.cmd&#xff08;类似linux的shell脚本&#xff09; 所有语句符号不区分大小写 帮助提示信息&#xff1a;命令 /? 1 基本语法 (1) 注释&#xff1a;rem 注释文本不执行 (2) 关闭盘符输出&#xff1a;e…

城市生命线丨桥梁结构健康监测系统的作用

在城市建设当中&#xff0c;有非常多的城市基本建设&#xff0c;建设当中&#xff0c;桥梁作为不可忽视的一环&#xff0c;也需要有很多桥梁建设的智能监测系统&#xff0c;在这个桥梁结构健康监测系统中&#xff0c;桥梁的各个数值都能被监测得到。 WITBEE万宾使用城市生命线智…

MyBatis 操作数据库(入门)

一&#xff1a;MyBatis概念 (1)MyBatis &#x1f497;MyBatis是一款优秀的持久层框架&#xff0c;用于简化JDBC的开发 (2)持久层 1.持久层 &#x1f49c;持久层&#xff1a;持久化操作的层&#xff0c;通常指数据访问层(dao)&#xff0c;是用来操作数据库的 2.持久层的规范 ①…

4D Gaussian Splatting:用于实时的动态场景渲染

Wu G, Yi T, Fang J, et al. 4d gaussian splatting for real-time dynamic scene rendering[J]. arXiv preprint arXiv:2310.08528, 2023. 更多参考资料如下&#xff1a; 文章总结&#xff1a;4D Gaussian Splatting for Real-Time Dynamic Scene Rendering&#xff1b;疑难问…