在C/ c++中等效的GNU八度代码

GNU Octave Code Equivalent in C/C++

本文关键字:代码 八度 GNU c++      更新时间:2023-10-16

我有一些GNU八度/Matlab代码,我想翻译成C或c++。我可以处理大部分的翻译,但我不知道x1=0:1:pts-1;在C代码中会翻译成什么。如果我理解正确,它是Octave的范围类型,但我不确定C或c++中的什么数据类型会支持相同的功能。完整的脚本是:

pkg load signal
fs = 48000;
fc=18300;
rlen=10;
ppiv=100;
beta=9.0;
apof=0.9;
apobeta=0.7;
pts = ppiv*rlen+1;
x1=0:1:pts-1;%this line here!!!!
x2=rlen*2*(x1-(pts-1)/2 +0.00001)/(pts-1); % and the the usage of x1 in this line
x3=pi*fc/fs*x2;
h=sin(x3)./x3;
w=kaiser(pts,beta);
g=w.*h;
aw = 1-apof*kaiser(pts,apobeta);
g=aw.*g;
g=g/max(g);

figure(1);
subplot(1,2,1);
plot(x2/2,g);
axis([-rlen/2 rlen/2 -0.2 2.0002]);
%xlabel(“Time in Sampling Intervals”);
%title(‘Bandlimited Impulse’);
subplot(1,2,2);
zpad=20;
g2=[g;zeros((zpad-1)*pts,1)];
wspec=abs(fft(g2));
wspec=max(wspec/max(wspec),0.00001);
fmax=60000;
rng = round(rlen*zpad*fmax/fs);
xidx = 0:1:rng;
semilogy(fmax/1000*xidx/rng,wspec(1:(rng+1)));
%xlabel(‘Frequency in kHz’);
%title(‘amplitude spectrum’);
grid;
hold;
plot([20 20],[0.00001,1]);
plot([fs/1000-20 fs/1000-20], [0.00001 1]);
plot([fs/1000 fs/1000], [0.00001 1]);
hold off;

所以我要找的是一个代码片段或如何处理这种转换的一些资源。

Thanks in advance

由于您是从Octave代码转换,因此使用Octave的c++库非常有意义。他们可以在网上看到它的氧气文档。

对于您的具体情况,您可以使用octave_range类:

#include "ov-range.h"
octave_range x (0, pts -1, 1);

注意,这只是一个范围,就像在Octave中一样。如果你想从中得到一个矩阵,你可以这样做:

Matrix mx = x.matrix_value ();

如果这让你感到困惑,将范围转换为矩阵,看看它是如何在Octave中实际完成的。创建一个范围并检查它在内存中的大小。然后与由此创建的矩阵进行比较:

octave-cli-3.8.1> x = 0:1:10000;
octave-cli-3.8.1> whos x
Variables in the current scope:
   Attr Name        Size                     Bytes  Class
   ==== ====        ====                     =====  ===== 
        x           1x10001                     24  double
Total is 10001 elements using 24 bytes
octave-cli-3.8.1> x = [0:1:10000];
octave-cli-3.8.1> whos x
Variables in the current scope:
   Attr Name        Size                     Bytes  Class
   ==== ====        ====                     =====  ===== 
        x           1x10001                  80008  double
Total is 10001 elements using 80008 bytes

x1是一个数组(如果你喜欢,也可以是矩阵),包含值0,1,2,3,…,(pts-1)。

你可以在C中生成它,比如:

int a[500];
int i;
for(i = 0; i < 500; i++) {
  a[i] = i;
}