一种复数求模的实用方法

C++实现复数矩阵求逆 matlab inv C++实现复数矩阵求逆 matlab inv一、引言二、原理2.1 实数矩阵求逆2.2 复数矩阵求逆三、代码四、测试 一、引言 之前偶尔一次有用到将matlab转为C++语言的需求,其中matlab有一个inv函数可以非常方便的求矩阵的逆,甚至是复数矩阵。而C++中没有类似的函数。在csdn上有一个matlab2c的库的博客(github地址第80行开始),但是只有实数矩阵求逆的代码,而我又在百度上搜到一篇文献中写到将复数矩阵转为两个实数矩阵然后在进行求解。然后我就将两个代码一结合,就实现了复数矩阵求逆。经 阅读详情
AI摘要

本文介绍了一种快速估算复数模的方法,通过Alpha和Beta系数加权最大值和最小值来近似计算,提供了不同场景下的最优参数组合及其实现代码。

一种复数求模的实用方法


        在DSP中,经常遇到复数求模的问题。对于复数X

                        X = R+j*I   (1)

其幅度magX为:

                     magX = sqrt(R^2+I^2)  (2)

由上式可知,复数求模的问题可看做是一个实数求根的问题。对这个问题有一些成熟算法,如博文所述:http://blog.youkuaiyun.com/deepdsp/article/details/7539823

       这里,针对复数求模这种特殊情况,在精度要求不太高的情况下,可用如下近似方法计算:

                     MagX = Alpha * max(|R|, |I|) + Beta * min(|R|, |I|)  (3)

其中Alpha和Beta为系数,根据不同的准则,如均方根误差最小,峰值误差最小等,这两个系数的取值有所不同。具体数值参见下表。最简单的情况,选取Alpha=1,Beta=0.25,也能得到很不错的结果。

 

=====================================================================
             Alpha * Max + Beta * Min Magnitude Estimator
 
Name                  Alpha           Beta       Avg Err   RMS   Peak
                                                 (linear)  (dB)  (dB)
---------------------------------------------------------------------
Min RMS Err      0.947543636291 0.392485425092   0.000547 -32.6 -25.6
Min Peak Err     0.960433870103 0.397824734759  -0.013049 -31.4 -28.1
Min RMS w/ Avg=0 0.948059448969 0.392699081699   0.000003 -32.6 -25.7
1, Min RMS Err   1.000000000000 0.323260990000  -0.020865 -28.7 -23.8
1, Min Peak Err  1.000000000000 0.335982538000  -0.025609 -28.3 -25.1
1, 1/2           1.000000000000 0.500000000000  -0.086775 -20.7 -18.6
1, 1/4           1.000000000000 0.250000000000   0.006456 -27.6 -18.7
Frerking         1.000000000000 0.400000000000  -0.049482 -25.1 -22.3
1, 11/32         1.000000000000 0.343750000000  -0.028505 -28.0 -24.8
1, 3/8           1.000000000000 0.375000000000  -0.040159 -26.4 -23.4
15/16, 15/32     0.937500000000 0.468750000000  -0.018851 -29.2 -24.1
15/16, 1/2       0.937500000000 0.500000000000  -0.030505 -26.9 -24.1
31/32, 11/32     0.968750000000 0.343750000000  -0.000371 -31.6 -22.9
31/32, 3/8       0.968750000000 0.375000000000  -0.012024 -31.4 -26.1
61/64, 3/8       0.953125000000 0.375000000000   0.002043 -32.5 -24.3
61/64, 13/32     0.953125000000 0.406250000000  -0.009611 -31.8 -26.6
=====================================================================

 

 

附录:C实现代码

/*(代码来源于网络,版权归原作者所有)*/


#include <math.h>
#include <stdio.h>
/*********************************************************************
*
*
* Name: mag_est.c
*
* Synopsis:
*
*   Demonstrates and tests the "Alpha * Min + Beta * Max" magnitude
*   estimation algorithm.
*
* Description:
*
*   This program demonstrates the "Alpha, Beta" algorithm for 
*   estimating the magnitude of a complex number.  Compared to
*   calculating the magnitude directly using sqrt(I^2 + Q^2), this
*   estimation is very quick.
*
*   Various values of Alpha and Beta can be used to trade among RMS
*   error, peak error, and coefficient complexity.  This program
*   includes a table of the most useful values, and it prints out the
*   resulting RMS and peak errors.
*
* Copyright 1999  Grant R. Griffin
*
*********************************************************************/
/********************************************************************/
double alpha_beta_mag(double alpha, double beta, double inphase,
                      double quadrature)
{
   /* magnitude ~= alpha * max(|I|, |Q|) + beta * min(|I|, |Q|) */
   double abs_inphase = fabs(inphase);
   double abs_quadrature = fabs(quadrature);
   if (abs_inphase > abs_quadrature) {
      return alpha * abs_inphase + beta * abs_quadrature;
   } else {
      return alpha * abs_quadrature + beta * abs_inphase;
   }
}
/*********************************************************************/
double decibels(double linear)
{
   #define SMALL 1e-20
   if (linear <= SMALL) {
      linear = SMALL;
   }
   return 20.0 * log10(linear);
}
/*********************************************************************/
void test_alpha_beta(char *name, double alpha, double beta,
                     int num_points)
{
   #define PI 3.141592653589793
   int ii;
   double phase, real, imag, err, avg_err, rms_err;
   double peak_err = 0.0;
   double sum_err = 0.0;
   double sum_err_sqrd = 0.0;
   double delta_phase = (2.0 * PI) / num_points;
   for (ii = 0; ii < num_points; ii++) {
      phase = delta_phase * ii;
      real = cos(phase);
      imag = sin(phase);
      err = sqrt(real * real + imag * imag)
            - alpha_beta_mag(alpha, beta, real, imag);
      sum_err += err;
      sum_err_sqrd += err * err;
      err = fabs(err);
      if (err > peak_err) {
         peak_err = err;
      }
   }
   avg_err = sum_err / num_points;
   rms_err = sqrt(sum_err_sqrd / num_points);
   printf("%-16s %14.12lf %14.12lf  %9.6lf %4.1lf %4.1lf\n",
          name, alpha, beta, avg_err, decibels(rms_err),
          decibels(peak_err));
}
/*********************************************************************/
void main(void)
{
   #define NUM_CHECK_POINTS 100000
   typedef struct tagALPHA_BETA {
      char *name;
      double alpha;
      double beta;
   } ALPHA_BETA;
   #define NUM_ALPHA_BETA 16
   const ALPHA_BETA coeff[NUM_ALPHA_BETA] = {
      { "Min RMS Err",      0.947543636291, 0.3924854250920 },
      { "Min Peak Err",     0.960433870103, 0.3978247347593 },
      { "Min RMS w/ Avg=0", 0.948059448969, 0.3926990816987 }, 
      { "1, Min RMS Err",              1.0,     0.323260990 },
      { "1, Min Peak Err",             1.0,     0.335982538 },
      { "1, 1/2",                      1.0,      1.0 / 2.0  },
      { "1, 1/4",                      1.0,      1.0 / 4.0  },
      { "Frerking",                    1.0,            0.4  },
      { "1, 11/32",                    1.0,     11.0 / 32.0 },
      { "1, 3/8",                      1.0,      3.0 / 8.0  },
      { "15/16, 15/32",        15.0 / 16.0,     15.0 / 32.0 },
      { "15/16, 1/2",          15.0 / 16.0,      1.0 / 2.0  },
      { "31/32, 11/32",        31.0 / 32.0,     11.0 / 32.0 },
      { "31/32, 3/8",          31.0 / 32.0,      3.0 / 8.0  },
      { "61/64, 3/8",          61.0 / 64.0,      3.0 / 8.0  },
      { "61/64, 13/32",        61.0 / 64.0,     13.0 / 32.0 }
   };
   int ii;
   printf("\n             Alpha * Max + Beta * Min Magnitude
Estimator\n\n");
   printf("Name                  Alpha           Beta       Avg Err  
RMS   Peak\n");
   printf("                                                 (linear) 
(dB)  (dB)\n");
  
printf("---------------------------------------------------------------------\n");
   for (ii = 0; ii < NUM_ALPHA_BETA; ii++) {
      test_alpha_beta(coeff[ii].name, coeff[ii].alpha, coeff[ii].beta,
                      1024);
   }
}

近似算法的设计与分析 本书介绍了近似算法设计思想,适合不同层次的读者阅读。 立即下载

相关推荐

流媒体学习之路(mediasoup)——simulcast 与 svc 简介(7)

流媒体学习之路(mediasoup)——simulcast 与 svc(7) 文章目录流媒体学习之路(mediasoup)——simulcast 与 svc(7)

qw225967的博客 7339

复数求模运算的快速近似实现方法

数字信号处理中,经常需要对复数进行求模运算。找了一些资料,发现对精度要求不高的情况下是有比较好的简化运算方法的。我这里整理出了如下简化步骤: 1. 对复数的实部和虚部取绝对值 2. 把绝对值大的定为Max,小的定位Min 3. 模值等于Max+Min*0.25 得到的值不是精确值,但是能够满足我自己的需求。直接上代码:struct Complex { int Re; int

yinchao163的专栏 5689

VINS-Fusion实战:从零搭建无人机视觉SLAM系统(附ROS配置全流程)

本文详细介绍了如何从零开始为无人机搭建基于VINS-Fusion的视觉SLAM系统。内容涵盖硬件选型(重点推荐双目相机与IMU搭配)、ROS环境配置、传感器标定、核心参数调优以及实际飞行测试与问题排解全流程,旨在帮助开发者实现稳定、精确的无人机自主定位与导航。

wasm7browser的博客 214

复数的模的计算公式

复数的模的计算公式

听海边涛声 2108

为何LPDDR4支持on-die ECC,但是DDR4却不支持呢?

DRAM的ECC,目前的编码方式都是128bit data,产生8bit parity或者ECC code. 而且必须要128bit才行。这8bit的ECC code是要被写入到DRAM内存里面的,从而read的时候,可以读取这8bit ECC code来判定read data是否有错,如果是SBF,就可以纠错了,如果是double bit,大部分时候是可以detect到错误,即所谓的SEC(Single Error Correct) + DED(Double Error Detect).

一个DRAM从业者的告白 1555

Linux中断子系统(二)—— 通用框架处理

1、数据结构分析 (1)中断描述符结构structirq_desc: 1)打开CONFIG_SPARSE_IRQ宏(中断编号不连续),中断描述符以radix- tree来组织,用户在初始化时进行动态分配,然后再插入radix-tree中; 2)关闭CONFIG_SPARSE_IRQ宏(中断编号连续),中断描述符以数组的 形式组织,并且已经分配好; 3)不管哪种形式,最终都可以通过linuxirq号来找到对应的中断描述符; (2)stru...

weixin_38428439的博客 4871

复数幅值近似估计

作者:桂。 时间:2018-01-2719:52:57 链接:http://www.cnblogs.com/xingshansi/p/8367063.html 前言 本文摘自:《复数信号模值近似计算及硬件实现》 正文 硬件具体实现流程不再赘述。 ...

cpongo881 1286

实例讲解Simulink CAN通讯丢失故障判定模型搭建及仿真测试验证方法

本文通过ABS通讯丢失故障触发、判定条件Simulink模型的搭建和仿真的讲解,介绍了一种控制器CAN通讯丢失故障判定的方法和建模方法,希望能给相关技术人员带来一定参考和帮助。

qq_43011586的博客 3684

求模的常用公式

运算规则 模运算与基本四则运算有些相似,但是除法例外。其规则如下: (a + b) % p = (a % p + b % p) % p (1) (a - b) % p = (a % p - b % p ) % p (2) (a * b) % p = (a % p * b % p) % p (3) a ^ b % p = ((a % p)^b) % p (4) 结合律: ((a+b) % p + c...

蜡笔小新冲鸭!!! 7336

手把手教你学simulink(31.31)--双向DCDC电源场景示例:设计并实现一个基于变频控制的双向降压变换

设计并实现一个基于 Simulink 的双向降压变换器,能够在充电模式(从高压侧向低压侧传输能量)和放电模式(从低压侧向高压侧传输能量)之间切换,确保输出电压稳定,并根据负载变化自动调整工作模式。

MHD0815的博客 343

全功能爬虫框架:Botasaurus 的详细使用(现代化、反检测、高并发的智能爬虫框架)

Botasaurus是一个基于 Python 的全栈式智能数据采集框架。它深度融合了以下关键技术: 无头浏览器自动化(Headless Browser Automation):基于 Playwright 或 Puppeteer,支持 Chromium、Firefox、WebKit; 高级反检测引擎(Anti-Detection Engine):自动绕过 WebDriver、Canvas、AudioContext 等 50+ 种指纹检测; 声明式任务模型(Declarative Task Model):用装

数据知道的博客 4370

高精度求模

int hmod(string a,int b)//高精度取余单精度 输出余数 { int temp=0; unsigned long len=a.length(); for(int i=0;i<len;i++) temp=(temp*10+a[i]-'0')%b; return temp; } 转载于:https:...

weixin_30514745的博客 161

Unity与iOS原生交互实战指南

C#(DllImport) → C 接口(extern "C") → Objective‑C / SwiftObjective‑C → UnitySendMessage → C#(GameObject + public 方法)在写.mm文件;在里面写;C# 用声明;调用它,参数就是 string / 数值等;在.mm里做你想做的 iOS 原生操作。在 Unity 里准备一个常驻 GameObject,比如;上面挂一个脚本,写;在 iOS 插件中用;

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 1357

复数的加、减、乘、除、求模求共轭复数的运算

复数的运算法则: 加法运算: 复数的加法按照以下规定的法则进行:设z1=a+bi,z2=c+di是任意两个复数,则它们的和是(a+bi)+(c+di)=(a+c)+(b+d)i; 例如:a = 1+2i,b = 3+4i 即可得 a+b = 4+6i 减法法则: 复数的减法按照以下规定的法则进行:设z1=a+bi,z2=c+di是任意两个复数,则它们的差是 (a+bi)-(c+di)=(a-c)...

一直努力的丫_的博客 2万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

//编写一个复数类,包含实部和虚部属性,还有复数相加、相减以及复数的求模、输出复数字符串”a+bi”。

import java.util.Scanner; public class Complexnum { //编写一个复数类,包含实部和虚部属性,还有复数相加、相减以及复数的求模、输出复数字符串”a+bi”。 private double a; private double b; private double c; private double d; public void set() ...

为什么他的emp没后座 5786

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【Java】编写一个复数类,包含实部和虚部属性,还有复数相加、相减以及复数的求模、输出复数字符串”a+bi”

编写一个复数类,包含实部和虚部属性,还有复数相加、相减以及复数的求模、输出复数字符串”a+bi”

Dershy_的博客 5762

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

CORDIC实现FPGA复数求模(Xilinx CORDIC IP 6.0)

介绍常CORDIC核对复数求模用的定点数表示方法。 1.定点数基础及验证 2.IP核设置 3.仿真验证

9228

CUDA调用cuFFT后对复数求模

      当我们使用显卡调用cuFFT库计算FFT后(FFT计算,请参考https://blog.youkuaiyun.com/endlch/article/details/46724811),需要对cufftComplex*类型的数据进行进一步处理,比如取模,两个复数相乘等操作,恰巧,库里面也配套了cuComplex.h,其中包含复数基本操作函数,主机和设备端均可调用。我目前还没找到针对复数数组取模的现成...

qq_41361834的博客 3271

一种高精度复数求模近似算法的设计及实现

为快速高精度的完成信号处理过程中近似复数求模运算,本文提出了一种高精度复数求模近似算法的设计和FPGA实现方法,其结合了三种具有不同误差特性的近似求模算法,并采用了简单的加法和移位操作,实现了0.878%的相对误差,精度是同类型其他近似算法的1.57-3.4倍。

Nessaj Heng 4068

Vivado cordic IP求模求角教程

前言 当需要对复数求模的时候,用FPGA怎么求呢?怎么开根号? 方法1:先求幅值平方和,再使用cordic IP开根号。(蠢办法) 方法2:直接用cordic求取模值。 此处只介绍方法2,资源占用更少,更方便。 求模原理如下图所示。已知(x0,y0),即复信号的实部和虚部,要求模值和角度,即为(r,ɵ)。 流程 (1)既然是用IP,自然首先要看官方的IP说...

小翁同学 3340

分数复数(分子分母均为复数)的模值和相角

对于分母上含有复数的情况进行计算 对于复数的模值和相角进行计算得到最简单的表达式 1、分子为实数 2、分子为虚数 3、分子为复数

qq_42849331的博客 4万+

【STM32F429的DSP教程】第19章 DSP复数运算-共轭,点乘和求模

完整版教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=94547 第19章 DSP复数运算-共轭,点乘和求模 本期教程主要讲解复数运算中的共轭,点乘和模的求解。 目录 第19章 DSP复数运算-共轭,点乘和求模 19.1 初学者重要提示 19.2 DSP基础运算指令 19.3 复数共轭运...

Simon223的博客 1835

matlab-基础 复数 实部、虚部、模、共轭、辐角

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34368949的博客 1万+

复数求模java程序_Java课程设计建立复数对象,公共方法有加减乘除求模

Java课程设计建立复数对象,公共方法有加减乘除求模 Java课程设计 1.建立复数对象,公共方法有加、减、乘、除、求模,重载toString()输出;考虑静态方法和动态方法。如有可能考虑操作符重载。 2.建立复数有序链表结构的集合(复数不能重复,按照模的大小排序),链表的操作有添加,删除,查找。 3.对上面的复数链表集合,做一个方法从文本文件读取复数添加到有序链表,另一个方法把链表导出到文本文件...

weixin_42181888的博客 358

如何求复数的模用计算机,Excel怎么计算复数? Excel对复数进行加减乘除指数对数模的教程...

我们知道复数不仅在数学学习中遇到,在工程计算中,也经常碰到。本文分享给大家如何使用身边的Excel,进行复数的加减乘除四则运算,以及求复数的指数、对数、正弦、余弦、模、共轭等函数。一、复数基本性质计算1、在正式分享复数计算之前,要强调一下,在Excel中,输入复数与输入普通的实数(小数、整数)等的方式(直接输入)不同,需要将整个复数以文本的格式输入。普通实数(小数、整数,包括负数形式),都可以直接...

weixin_35395422的博客 3041
上一篇: 小波变换网文精粹:小波变换和motion信号处理(十四)(全文完)
下一篇: 人生8种"最投资"
deepdsp
博客等级 码龄15年 859粉丝 62原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值