用傅里叶变换和反变换消除噪音信号干扰的软件实例

一、序言

场景一:噪音信号是数据采集处理的天敌,但无时无刻它都存在,于是,信号传输时进行屏蔽防护、模数转换时给予充分的采保时间、电路实现上低通带通处理,为了减小电解电容的感抗作用有时还附加上瓷片电容滤波,有时甚至不惜损失响应时间而加大滤波系数,等等。在没有信号输入时,我们希望采集到的数据是平直的基线,但往往采集到的数据伴有严重的噪音干扰,就如下面的图形:

场景二:大部分乐器的发声频率在20HZ 到 20KHZ,但高速上行驶驾车时往往听到的不仅仅是音乐的悠扬,可能还有相当份量20KHZ以上的外部噪音。

因此需要傅氏变换获得噪音频谱,然后去掉不需要的高频噪音成份。如果对滤波后的残余噪声信号施加以相反相位的音频信号进行抵消,大致上应该是最简陋的主动降噪功效了。

二、软件实现傅氏变化

环境:Mint-Linx 21.3, freebasic 1.10, fbmath 计算库

假设信号源是200hz理想的正弦波

它受到2000hz斜纹信号干扰,相互叠加在一起,软件画出的图形是如下的样子:

对受到干扰的信号进行ADC转换并采集512个点,采集速率是2.2khz, 然后进行傅氏变换,得到的下面的频谱图形。从图上可以清楚看到2000hz处的频谱波峰,在软件中去掉1000hz以上的频谱数据,留下的就是基频信号数据了。

然后再进行反变换,将频域信号转换为时域信号:

freebasic 程序代码:

' ******************************************************************
' Fast Fourier Transform (modified from Pascal program by Don Cross)
' http://groovit.disjunkt.com/analog/time-domain/fft.html
' ******************************************************************
'
' The program generates a time signal consisting of a large 200 Hz
' sine wave added to a small 2000 Hz cosine wave, which is graphed
' on the screen (Press a key after you are done viewing each graph)
'
' Next, it performs the FFT and graphs the resulting complex
' frequency samples.
'
' Then, it filters out all frequency components above 1000 Hz in
' the transformed data.
'
' Finally, it performs the inverse transform to get a filtered
' time signal back, and graphs the result.
'
' In addition, the program compares the FFT with the direct
' computation, on a set of random data.
'
' Results are stored in the output file fftout.txt
' ******************************************************************

#INCLUDE "fbmath.bi"
#INCLUDE "fbgfx.bi"

CONST NumSamples   = 512                        ' Buffer size must be power of 2
CONST SamplingRate = 22050                      ' Sampling rate in Hz
CONST MaxIndex     = NumSamples - 1             ' Max. array index
CONST MidIndex     = NumSamples \ 2
CONST DT           = 1 / SamplingRate           ' Time unit
CONST DF           = SamplingRate / NumSamples  ' Frequency unit

FUNCTION F(BYVAL T AS DOUBLE) AS DOUBLE
' Original signal
  RETURN SIN(200 * TwoPi * T) + 0.2 * COS(2000 * TwoPi * T)
END FUNCTION

SUB Test_CalcFrequency(InArray() AS Complex, OutArray() AS Complex)

  DIM AS Complex Z
  DIM AS INTEGER I

  ' Fill input buffers with random data
  FOR I = 0 TO MaxIndex
    InArray(I).X = 10000 * RND
    InArray(I).Y = 10000 * RND
  NEXT I

  PRINT #1, ""
  PRINT #1, " *** Testing procedure CalcFrequency *** "
  PRINT #1, ""

  FFT InArray(), OutArray()

  FOR I = 0 TO MaxIndex
    Z = CalcFrequency(I, InArray())
    PRINT #1, USING "##########"; I;
    PRINT #1, USING "##########.######"; OutArray(I).X; Z.X; OutArray(I).Y; Z.Y
  NEXT I
END SUB

SUB ListData(DataArray() AS Complex, BYREF Comment AS STRING)

  DIM AS INTEGER I

  PRINT #1, " *** "; Comment; " *** "
  PRINT #1, ""
  PRINT #1, "     index             real             imag"

  FOR I = 0 TO MaxIndex
    PRINT #1, USING "##########"; I;
    PRINT #1, USING "##########.######"; DataArray(I).X; DataArray(I).Y
  NEXT I

  PRINT #1, ""
  PRINT #1, STRING(44, "-")
  PRINT #1, ""
END SUB

SUB PlotData(T() AS DOUBLE, Z() AS Complex, BYREF Title AS STRING)

  DIM AS DOUBLE  Xmin, Xmax, Xstep  ' Ox scale
  DIM AS DOUBLE  Ymin, Ymax, Ystep  ' Oy scale
  DIM AS INTEGER I                  ' Loop variable

  DIM AS DOUBLE X(0 TO MaxIndex)    ' Real part of Z

  IF NOT InitScreen(12, 15, 0) THEN
    PRINT "Unable to set graphic mode!"
    EXIT SUB
  END IF

  InitGraph

  FOR I = 0 TO MaxIndex : X(I) = Z(I).X : NEXT I

  AutoScale T(), LinScale, Xmin, Xmax, Xstep
  AutoScale X(), LinScale, Ymin, Ymax, Ystep

  SetOxScale LinScale, Xmin, Xmax, Xstep
  SetOyScale LinScale, Ymin, Ymax, Ystep

  PlotOxAxis Ymin, 5
  PlotOyAxis Xmin, 2

  PlotGrid

  WriteTitles Title, "Time (s)", "Amplitude"

  COLOR 10 : PlotCurve T(), X(), 0, 0, -1

  SLEEP
  SCREEN 0
END SUB

SUB PlotFFT(Freq() AS DOUBLE, Z() AS Complex, BYREF Title AS STRING)

  DIM AS DOUBLE Fq(0 TO MidIndex)  ' Frequency
  DIM AS DOUBLE X(0 TO MidIndex)   ' Real part of FFT
  DIM AS DOUBLE Y(0 TO MidIndex)   ' Imag. part of FFT

  ' Graphic parameters for real and imaginary parts of FFT
  DIM AS TCurvParam CurvParam(1 TO 2) = _
    {(12, 0, 0, -1, "Real"),            _
     (14, 0, 0, -1, "Imag")}

  DIM AS DOUBLE  Xmin, Xmax, Xstep        ' Ox scale
  DIM AS DOUBLE  Yr_min, Yr_max, Yr_step  ' Oy scale (real part)
  DIM AS DOUBLE  Yi_min, Yi_max, Yi_step  ' Oy scale (imag. part)
  DIM AS DOUBLE  Ymin, Ymax, Ystep        ' Oy scale (global)

  DIM AS INTEGER I                        ' Loop variable

  IF NOT InitScreen(12, 15, 0) THEN
    PRINT "Unable to set graphic mode!"
    EXIT SUB
  END IF

  InitGraph

  FOR I = 0 TO MidIndex
    Fq(I) = Freq(I)
    X(I) = Z(I).X
    Y(I) = Z(I).Y
  NEXT I

  AutoScale Fq(), LinScale, Xmin, Xmax, Xstep
  AutoScale X(), LinScale, Yr_min, Yr_max, Yr_step
  AutoScale Y(), LinScale, Yi_min, Yi_max, Yi_step

  #ifdef USE_PREFIX
  Ymin  = fbMin(Yr_min, Yi_min)
  Ymax  = fbMax(Yr_max, Yi_max)
  Ystep = fbMin(Yr_step, Yi_step)
  #else
  Ymin  = Min(Yr_min, Yi_min)
  Ymax  = Max(Yr_max, Yi_max)
  Ystep = Min(Yr_step, Yi_step)
  #endif

  SetOxScale LinScale, Xmin, Xmax, Xstep
  SetOyScale LinScale, Ymin, Ymax, Ystep

  PlotOxAxis Ymin, 5
  PlotOyAxis Xmin, 2

  PlotGrid

  WriteTitles Title, "Frequency (Hz)", "FFT"

  WITH CurvParam(1)
    COLOR .Col
    PlotCurve Fq(), X(), .Symbol, .Size, .Connect
  END WITH

  WITH CurvParam(2)
    COLOR .Col
    PlotCurve Fq(), Y(), .Symbol, .Size, .Connect
  END WITH

  WriteLegend CurvParam()

  SLEEP
  SCREEN 0
END SUB

DIM AS DOUBLE  T(0 TO MaxIndex)         ' Time
DIM AS DOUBLE  Freq(0 TO MaxIndex)      ' Frequencies
DIM AS Complex InArray(0 TO MaxIndex)   ' FFT input
DIM AS Complex OutArray(0 TO MaxIndex)  ' FFT output

DIM AS INTEGER I, FreqIndex, SymIndex

FOR I = 0 TO MaxIndex
  T(I) = I * DT
  Freq(I) = I * DF
  InArray(I).X = F(T(I))
  InArray(I).Y = 0
NEXT I

OPEN "fftout.txt" FOR OUTPUT AS #1

ListData InArray(), "Time domain data before transform"
PlotData T(), InArray(), "Original signal"

FFT InArray(), OutArray()
PlotFFT Freq(), OutArray(), "Fourier Transform"

ListData OutArray(), "Frequency domain data after transform"

' Filter out everything above 1000 Hz (low-pass)
FreqIndex = 1000 / DF
SymIndex = NumSamples - FreqIndex

FOR I = 0 TO MaxIndex
  IF (I > FreqIndex AND I < MidIndex) OR _
     (I >= MidIndex AND I < SymIndex) THEN
       OutArray(I).X = 0
       OutArray(I).Y = 0
  END IF
NEXT I

IFFT OutArray(), InArray()

ListData InArray(), "Time domain data after inverse transform"
PlotData T(), InArray(), "Filtered signal"

Test_CalcFrequency InArray(), OutArray()

CLOSE #1

如果以上述512字节作为缓冲区,对采集的数据进行滑动(新陈代谢逐步替换)更新,可以得到连续处理后的时域信号。

注:

fbmath库是国外一个教授自己用freebasic编写的,是开源的,放在了sourceforge 上供下载。下载后用freebasic进行编译,生成libmath.a静态库,下载的包里有编写好的fbmath.bi头文件。fbmath.bi放在/usr/include/freebasic下面, fbmath.a放在/usr/lib/x86_64-linux-gnu下面(或是其它能找到的路径下面)。

fbmath包含有矩阵变换,拉氏变换,微积分方程等多种计算程序。largeint是计算超长整数的程序,比如2^65536 的计算。很好的东西,可惜平时用不上,上学时又没有。

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

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

相关文章

python的ITS 信息平台的设计与实现flask-django-nodejs-php

第二&#xff0c;陈列说明该系统实现所采用的架构、系统搭建采用的服务器、系统开发环境和使用的工具&#xff0c;以及系统后台采用的数据库。 最后&#xff0c;对系统进行全面测试&#xff0c;主要包括功能测试、查询性能测试、安全性能测试。 分析系统存在的不足以及将来改进…

深度学习pytorch——感知机(Perceptron)(持续更新)

什么是感知机&#xff1f; 感知机是由美国学者FrankRosenblatt在1957年提出来的。感知机是作为神经网络&#xff08;深度学习&#xff09;的起源的算法。因此&#xff0c;学习感知机的构造也就是学习通向神经网络和深度学习的一种重要思想。 感知机接收多个输入信号&#xff0c…

在服务器(Ubuntu20.04)安装用户级别的cuda11.8(以及仿照前面教程安装cuda11.3后安装cudnn和pytorch1.9.0)

1、cuda11.8的下载 首先在cuda官网下载我们需要的cuda版本&#xff0c;这里我下载的是cuda11.8&#xff08;我的最高支持cuda12.0&#xff09; 这里我直接使用wget命令下载不了&#xff0c;于是我直接在浏览器输入后面的链接下载到本地&#xff0c;之后再上传至服务器的&am…

如何使用人工智能和ChatGPT来优化营销转化率

人工智能 &#xff08;AI&#xff09; 和营销的交集正在彻底改变企业与客户互动的方式&#xff0c;最终改变营销转化率。人工智能能够分析大量数据、理解模式和自动执行任务&#xff0c;它不仅是一项创新技术&#xff0c;而且是营销领域的根本性转变。这种转变允许更加个性化、…

Loader和Plugin的区别?编写Loader,Plugin的思路。

一、区别 前面两节我们有提到Loader与Plugin对应的概念&#xff0c;先来回顾下 loader 是文件加载器&#xff0c;能够加载资源文件&#xff0c;并对这些文件进行一些处理&#xff0c;诸如编译、压缩等&#xff0c;最终一起打包到指定的文件中plugin 赋予了 webpack 各种灵活的…

Jupyter服务器端为R语言安装readr包

1.登录debian服务器 方式1.Windows10中可利用putty登录linux服务器 方式2.自从搭建了Jupyter服务器后&#xff0c;还可以从juypyter的终端来登录linux服务器 2.进入R语言命令行 3.安装readr包 >install.packages(‘readr’) …

四川宏博蓬达法律咨询有限公司:法律服务安全的新标杆

在这个法治社会&#xff0c;法律服务行业扮演着越来越重要的角色。四川宏博蓬达法律咨询有限公司&#xff0c;作为行业内的佼佼者&#xff0c;始终坚持以客户为中心&#xff0c;为客户提供专业、高效、安全的法律服务。 一、公司背景与实力展示 四川宏博蓬达法律咨询有限公司自…

python - 更改pdf中文本的字体高亮颜色(fitz模块)

import fitzdoc fitz.open(r"e:/test.pdf") pagedoc[0]# 按照指定的位置设置颜色 highlight page.add_highlight_annot((20, 500,60, 520)) highlight.set_colors(stroke[1, 1, 0]) # light red color (r, g, b) 颜色rgb每个除以255得出 highlight.update()# 按照…

docker 安装部署 jenkins

今天 小☀ 给大家普及一下什么是 jenkins&#xff01;&#xff01; Jenkins是一个开源软件项目&#xff0c;基于Java开发的持续集成工具。它提供了一个开放易用的软件平台&#xff0c;使软件项目可以进行持续集成。Jenkins起源于Hudson&#xff0c;主要用于持续、自动地构建、…

面试笔记——MySQL(主从同步原理、分库分表)

主从同步原理 主从同步结构&#xff1a;主库负责写数据&#xff0c;从库负责读数据&#xff0c;如图—— MySQL主从复制的核心就是二进制日志&#xff08;BINLOG&#xff09;&#xff0c;它记录了所有的 DDL&#xff08;数据定义语言&#xff09;语句和 DML&#xff08;数据操…

Tkinter 一文读懂

Tkinter 简介 Tkinter&#xff08;即 tk interface&#xff0c;简称“Tk”&#xff09;本质上是对 Tcl/Tk 软件包的 Python 接口封装&#xff0c;它是 Python 官方推荐的 GUI 工具包&#xff0c;属于 Python 自带的标准库模块&#xff0c;当您安装好 Python 后&#xff0c;就可…

使用PDFBox调整PDF每页格式

目录 一、内容没有图片 二、内容有图片 maven依赖&#xff0c;这里使用的是pdfbox的2.0.30版本 <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.30</version></dependency>…

从零开始学Spring Boot系列-集成Kafka

Kafka简介 Apache Kafka是一个开源的分布式流处理平台&#xff0c;由LinkedIn公司开发和维护&#xff0c;后来捐赠给了Apache软件基金会。Kafka主要用于构建实时数据管道和流应用。它类似于一个分布式、高吞吐量的发布-订阅消息系统&#xff0c;可以处理消费者网站的所有动作流…

【Linux】内核空间动态内存申请

&#x1f525;博客主页&#xff1a;PannLZ &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 文章目录 内核空间动态内存申请1.kmalloc()2._ _get_free_pages()3.vmalloc() 内核空间动态内存申请 1.kmalloc() #include <linux/slab.h>vo…

Flask项目中使用蓝湖实现启动项配置——多个controller项

项目结构 # controller1-__init__.py from flask import Blueprintcont2_sale_blueprint Blueprint(cont2_sale_blueprint, __name__) cont2_user_blueprint Blueprint(cont2_user_blueprint, __name__) from . import user_controller from . import sale_controller# contr…

推荐一款很不错的vscode高亮插件

用过很多款高亮插件&#xff0c;总感觉大部分显示都很乱&#xff0c;但是其中有一款用起来很清晰明了&#xff0c;很喜欢&#xff01; 插件名字&#xff1a;select-highlight-cochineal-color 使用效果&#xff1a; 底色高亮让人感觉很清晰&#xff0c;一个好的高亮插件能让你…

VScode通过ssh连接github

通过ssh连接github 1.生成公钥和私钥2.设置config文件3.配置ssh免密登录4.远程仓库初始化 1.生成公钥和私钥 首先选择一个文件夹&#xff0c;右击 git bash here&#xff0c;在命令行输入命令&#xff0c;按下三次回车生成一个**.ssh文件夹**&#xff0c;一般在用户的user根目…

Django信号

一、介绍 Django有一个“信号调度器(signal dispatcher)”,当框架中的其他地方发生操作时,它可以通知一些解耦的应用程序 官网:信号 | Django 文档 | Django 1.1、内置的信号的使用 1.1.1、定义接收器函数 def my_callback(sender, **kwargs):print("Request finis…

【Linux】/proc文件系统

&#x1f525;博客主页&#xff1a;PannLZ &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 文章目录 /proc文件系统1.获取与进程相关的信息:/proc/ID2./proc 目录下的系统信息3. 访问/proc 文件4.动态创建/proc文件系统4.1创建目录4.2创建proc…

【回溯专题part1】【蓝桥杯备考训练】:n-皇后问题、木棒、飞机降落【已更新完成】

目录 1、n-皇后问题&#xff08;回溯模板&#xff09; 2、木棒&#xff08;《算法竞赛进阶指南》、UVA307&#xff09; 3、飞机降落&#xff08;第十四届蓝桥杯省赛C B组&#xff09; 1、n-皇后问题&#xff08;回溯模板&#xff09; n皇后问题是指将 n 个皇后放在 nn 的国…