那些奇奇怪怪的编程逻辑漏洞,你能找到问题所在吗?

不同的公式得到了相同的结果,相同的公式得到了不同的结果?

起因

最近接了一个labview转C#的任务,要求我用C#实现labview里SVT weighting Filter的功能,其中最重要的则是音频的的时域A加权。但labview使用的公式节点,并不能作为我编程的参照,所以在网上查了很多资料,其中有一篇文章用的matlab,且有与相关文献较为吻合的图,我参照他的方法得到了加权系数图,但我需要的是C#的代码,所以尝试将matlab转C#,这个时候,神奇的事情发生了:

问题

先看两张图,后面我会放上源码以供大家探讨:
在这里插入图片描述
这是第一张图,看蓝色箭头,我们可以知道,用的是同一个公式,看红色箭头我们可以知道得出的结果天差地别!

(“这么小的程序,不知道找了多久的问题”,得到下面的图:)

在这里插入图片描述
通过蓝色的箭头我们可以看到,两门编程语言的计算公式并不同,通过红色的箭头我们可以看到,得出的答案却是相同的!

源码(这是得出一致答案的代码,但请注意,他们的计算公式有且仅有一个地方不同,这间接排除了搬错公式的可能)

matlab源码
f1=20.60;
f2=107.7;
f3=737.9;
f4=12194;
SampleRate=44100;
A= zeros(1,SampleRate);
dBA= zeros(1,SampleRate);
k= zeros(1,SampleRate);
for i=1:SampleRate
    k(i)=i;
    f=i^2;
    A(i)=(1.2588966*(148693636*f*f)/((f+424.3600)*((f+1.1599e+04)*(f+5.4450e+05))^(1/2)*(f+148693636)));
    dBA(i)=20*log10(1.2588966*(148693636*f*f)/((f+424.3600)*((f+1.1599e+04)*(f+5.4450e+05))^(1/2)*(f+148693636)));
end
A=A(:,11:SampleRate);
dBA=dBA(:,11:SampleRate);
k=k(:,11:SampleRate);
figure();
plot(k,A);
xlabel('Frequency Hz');
ylabel('Gain Amplitude');
figure();
semilogx(k,dBA,'r');
grid on %标注格栅
xlabel('Frequency (Hz)');
ylabel('Gain dB');

C#源码
class test
{
static void Main(string[] args)
{
var x=Only_for_weight();
}
 static (double[],double[],double[]) Only_for_weight()
        {
            double f1 = 20.60;
            double f2 = 107.7;
            double f3 = 737.9;
            double f4 = 12194;
            double SampRate = 44100;
            double[] A = new double[(int)SampRate];
            double[] dBA = new double[(int)SampRate];
            double[] k = new double[(int)SampRate];
            for(int i=1;i<SampRate;i++)
            {
                k[i] = i;
                double f = Math.Pow(i, 2);
                A[i] = (1.2588966 * (148693636 * f ) / ((f + 424.3600) * Math.Pow(((f + 1.1599e+04) * (f + 5.4450e+05)),(1 / 2)) * (f + 148693636)));
                dBA[i] = 20 * Math.Log10(1.2588966 * (148693636 * f ) / ((f + 424.3600) * Math.Pow(((f + 1.1599e+04) * (f + 5.4450e+05)) , (1 / 2)) * (f + 148693636)));
                Console.WriteLine($"k:{k[i]}    A:{A[i]}    dBA:{dBA[i]}");
            }
            return (A, dBA, k);
        }
        }

写在最后

虽然我得到了正确的答案,但这奇怪的逻辑漏洞却令人疑惑,在查错时,根本没有想过是公式的问题,按道理说,即使编程语言不同,表现形式不同,同一个计算公式的逻辑也应该是相同的,毕竟这是我们可以用不同语言实现同一功能的前提,但是。。。编程的问题总是那么千奇百怪、猝不及防,这样的问题确实出现了。那么,你发现问题所在了吗?欢迎留言探讨。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

零度47

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值