MATLAB实现截位的问题

讨论MATLAB怎样提取10进制中的位的方法,因为做FFT时要用到截位,相去验证它,向同庆请教,

原来只是除以2的N次方,取模取余就行了,可恨我还想了一下午,也没有一个好办法。

接下来的问题是,对于负数我该怎么处理。

无论是有符号还是无符号数,如果做加减的话,都可以当做无符号数处理。但对于乘法运算则不然。

而蝶形运算是有乘法的,所以不能简单做为无符号数处理。具体实现过程如下:

%%=============================================================================
%%对第一级的输出进行截位处理
%%==============================================================================

%先转换成16进制,再换成10进制,把符号数据转换成无符号,其实不用这么麻烦的。直接用下面的程序即可。

%Stg1_OutData1_Real = Stg1_OutData1_Real+2^34*(Stg1_OutData1_Real < 0);
%Stg1_OutData2_Real = Stg1_OutData2_Real+2^34*(Stg1_OutData2_Real < 0); 
%Stg1_OutData1_Imag = Stg1_OutData1_Imag+2^34*(Stg1_OutData1_Imag < 0); 
%Stg1_OutData2_Imag = Stg1_OutData2_Imag+2^34*(Stg1_OutData2_Imag < 0);


Stg1_OutData1_Real = dec2hex(Stg1_OutData1_Real+2^34*(Stg1_OutData1_Real < 0),9);
Stg1_OutData2_Real = dec2hex(Stg1_OutData2_Real+2^34*(Stg1_OutData2_Real < 0),9);
Stg1_OutData1_Imag = dec2hex(Stg1_OutData1_Imag+2^34*(Stg1_OutData1_Imag < 0),9);
Stg1_OutData2_Imag = dec2hex(Stg1_OutData2_Imag+2^34*(Stg1_OutData2_Imag < 0),9);

% end;
Stg1_OutData1_Real = hex2dec(Stg1_OutData1_Real);
Stg1_OutData2_Real = hex2dec(Stg1_OutData2_Real);
Stg1_OutData1_Imag = hex2dec(Stg1_OutData1_Imag);
Stg1_OutData2_Imag = hex2dec(Stg1_OutData2_Imag);

%trancate process
%截去低16位
%提取中间16位
Stg1_OutData1_Real = floor(Stg1_OutData1_Real/2^16);
Stg1_OutData1_Real = mod(Stg1_OutData1_Real,2^16);
%截去低16位
%提取中间16位
Stg1_OutData2_Real = floor(Stg1_OutData2_Real/2^16);
Stg1_OutData2_Real = mod(Stg1_OutData2_Real,2^16);
%截去低16位
%提取中间16位
Stg1_OutData1_Imag = floor(Stg1_OutData1_Imag/2^16);
Stg1_OutData1_Imag = mod(Stg1_OutData1_Imag,2^16);
%截去低16位
%提取中间16位
Stg1_OutData2_Imag = floor(Stg1_OutData2_Imag/2^16);
Stg1_OutData2_Imag = mod(Stg1_OutData2_Imag,2^16);

for i= 1:32
if bitget(Stg1_OutData1_Real(i),16) == 1
Stg1_OutData1_Real(i) = Stg1_OutData1_Real(i) - 2^16;
else
Stg1_OutData1_Real(i) = Stg1_OutData1_Real(i);
end;

if bitget(Stg1_OutData2_Real(i),16) == 1
Stg1_OutData2_Real(i) = Stg1_OutData2_Real(i) - 2^16;
else
Stg1_OutData2_Real(i) = Stg1_OutData2_Real(i);
end;

if bitget(Stg1_OutData1_Imag(i),16) == 1
Stg1_OutData1_Imag(i) = Stg1_OutData1_Imag(i) - 2^16;
else
Stg1_OutData1_Imag(i) = Stg1_OutData1_Imag(i);
end;

if bitget(Stg1_OutData2_Imag(i),16) == 1
Stg1_OutData2_Imag(i) = Stg1_OutData2_Imag(i) - 2^16;
else
Stg1_OutData2_Imag(i) = Stg1_OutData2_Imag(i);
end;

end;

 %%===================================================

%%======================================================

a=1.23456789 

roundn(a,-4)

提取10进制中的某一位

bitget

转载于:https://www.cnblogs.com/zhongguo135/p/3579142.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来为您介绍一下如何使用 MATLAB 实现弦截法求解非线性方程的根。 弦截法是一种数值计算方法,用于求解非线性方程的根。它的基本思想是:通过两个初始点 $x_0$ 和 $x_1$,构造一条直线,将其与 $x$ 轴交点作为新的近似根 $x_2$,然后用 $x_1$ 和 $x_2$ 作为新的初始点,重复上述过程,直到满足精度要求为止。 下面是 MATLAB 实现弦截法的代码: ```matlab function [x, iter] = secant(f, x0, x1, tol, maxiter) % f: 待求解的非线性方程 % x0, x1: 初始点 % tol: 精度要求 % maxiter: 最大迭代次数 iter = 0; while abs(f(x1)) > tol && iter < maxiter x = x1 - f(x1) * (x1 - x0) / (f(x1) - f(x0)); x0 = x1; x1 = x; iter = iter + 1; end if iter == maxiter warning('达到最大迭代次数,可能未收敛!'); end ``` 其中,`f` 是待求解的非线性方程,`x0` 和 `x1` 是初始点,`tol` 是精度要求,`maxiter` 是最大迭代次数。函数的输出是近似根 `x` 和迭代次数 `iter`。 接下来,我们可以通过一个例子来演示如何使用该函数求解非线性方程的根。假设我们要求解方程 $x^3 - 2x - 5 = 0$ 在区间 $[2, 3]$ 内的根,可以按照以下步骤进行: 1. 定义非线性方程: ```matlab f = @(x) x^3 - 2*x - 5; ``` 2. 设置初始点和精度要求: ```matlab x0 = 2; x1 = 3; tol = 1e-6; ``` 3. 调用 `secant` 函数求解近似根: ```matlab [x, iter] = secant(f, x0, x1, tol, maxiter); ``` 完整代码如下: ```matlab f = @(x) x^3 - 2*x - 5; x0 = 2; x1 = 3; tol = 1e-6; maxiter = 100; [x, iter] = secant(f, x0, x1, tol, maxiter); fprintf('近似根为:%f\n', x); fprintf('迭代次数为:%d\n', iter); ``` 输出结果为: ``` 近似根为:2.094551 迭代次数为:9 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值