Pole25° 嵌入式C学习笔记——2020.7.17

#[Warning] passing argument 1 of 'Change_Form' makes pointer from integer without a cast

目的:将一个数组逆序排列,构建一个函数利用数组形参传递来完成此操作。
              然后编译时除了以下警告,以此文章记录此次ERRO!

在这里插入图片描述
代码如图:
在这里插入图片描述

为啥错呢?
错误出在 Change_Form(a[NUMBERS], b[NUMBERS], NUMBERS);

错误很明显,函数数组形参传递形式为 数组名a ,并不是a[NUMBERS]
自我理解:
		1.数组a 代表的是个地址,属于指针,a是一个指针常量
		2.a[NUMBERS]是一个整型数值    
				[]下标运算符   除优先级之外,下标引用和间接访问完全相同
		   比如:
		   		a[i]   相当于  *( a + (i) ) ,间接访问跟随指针访问它所指向的位置,
		   		此位置存储的是一个 int型的数值
函数参数传递传递需要的是个地址,就此解释了第二个警告!

因此,修改代码为 Change_Form(a, b, NUMBERS);,再次编译运行就OK了!
在这里插入图片描述

下面是一个简单的 Java 代码实现,可以生成一个6阶的Butterworth滤波器,截止频率为20Hz。 ```java import org.apache.commons.math3.analysis.UnivariateFunction; import org.apache.commons.math3.analysis.function.Sigmoid; import org.apache.commons.math3.analysis.function.Sinc; import org.apache.commons.math3.complex.Complex; import org.apache.commons.math3.complex.ComplexUtils; import org.apache.commons.math3.transform.FastFourierTransformer; import org.apache.commons.math3.transform.TransformType; import java.util.ArrayList; public class ButterworthFilter { private final int order; private final double cutoff; public ButterworthFilter(int order, double cutoff) { this.order = order; this.cutoff = cutoff; } public double[] apply(double[] input) { // 计算采样频率 double sampleRate = 1.0 / input.length; // 计算截止频率在频域中的位置 double normalizedCutoff = cutoff / (sampleRate / 2); // 构建巴特沃斯滤波器的极点 ArrayList<Complex> poles = new ArrayList<>(); for (int i = 0; i < order; i++) { double real = -Math.sin(Math.PI * (2 * i + 1) / (2 * order)); double imag = Math.cos(Math.PI * (2 * i + 1) / (2 * order)); poles.add(new Complex(real, imag)); } // 构建巴特沃斯滤波器的传递函数 UnivariateFunction transferFunction = new UnivariateFunction() { @Override public double value(double frequency) { Complex numerator = Complex.ONE; Complex denominator = Complex.ONE; for (Complex pole : poles) { double real = pole.getReal(); double imag = pole.getImaginary(); Complex term = ComplexUtils.polarToCartesian(1, -2 * Math.PI * frequency * real, -2 * Math.PI * frequency * imag); numerator = numerator.multiply(term); denominator = denominator.multiply(new Complex(1, -2 * Math.PI * frequency * real, -2 * Math.PI * frequency * imag)); } return numerator.divide(denominator).getReal(); } }; // 计算滤波器的频率响应 int fftSize = input.length * 2; double[] frequencyResponse = new double[fftSize]; for (int i = 0; i < fftSize; i++) { double frequency = i / (double)fftSize * sampleRate; frequencyResponse[i] = transferFunction.value(frequency); } // 将频率响应进行反变换,得到滤波器的时域响应 FastFourierTransformer transformer = new FastFourierTransformer(); double[] impulseResponse = transformer.transform(frequencyResponse, TransformType.INVERSE); // 将时域响应进行归一化,并截取前一半,得到滤波器的实际响应 double[] filter = new double[input.length]; for (int i = 0; i < input.length; i++) { filter[i] = impulseResponse[i] / input.length; } filter = java.util.Arrays.copyOfRange(filter, 0, input.length / 2); // 将滤波器应用到输入信号上 double[] output = new double[input.length]; for (int i = 0; i < input.length; i++) { double t = i * sampleRate; double sum = 0; for (int j = 0; j < filter.length; j++) { double tau = (j - filter.length / 2) * sampleRate; sum += filter[j] * new Sinc().value((t - tau) * normalizedCutoff); } output[i] = sum; } return output; } } ``` 在这个实现中,使用了 Apache Commons Math 库来进行一些数学计算,比如傅里叶变换。这个实现中的巴特沃斯滤波器是基于极点的实现方法,通过计算滤波器的传递函数,然后进行反傅里叶变换,得到滤波器的时域响应,最后将滤波器应用到输入信号上,得到滤波后的输出信号。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值