fsamp = 2;
deltaf = fsamp/nfft; % FFT resolution
Nfreqtimestwo = 128; % Used below
Nsines = Nfreqtimestwo/2 - 1; % Number of sine waves
fmult = [1:Nsines]; % multiplicative factor
freq_fund = fsamp/Nfreqtimestwo;
freq_sines = freq_fund.*fmult;
omega = 2*pi*freq_sines;
r = int16(0);
for(ii=1:Nsines)
r = r + cos((omega(ii)/fsamp)*(0:messageLen-1));
end
这是我目前用于创建输入信号的代码。但是,r
的最终结果是32,768个双精度数组。现在我想使用int16
做最好的近似。但是,我想指出幅度并不重要。例如,到目前为止,我认为最好的方法是:
fsamp = 2;
deltaf = fsamp/nfft; % FFT resolution
Nfreqtimestwo = 128; % Used below
Nsines = Nfreqtimestwo/2 - 1; % Number of sine waves
fmult = [1:Nsines]; % multiplicative factor
freq_fund = fsamp/Nfreqtimestwo;
freq_sines = freq_fund.*fmult;
omega = 2*pi*freq_sines;
r = int16(0);
for(ii=1:Nsines)
r = r + int16(8192*cos((omega(ii)/fsamp)*(0:messageLen-1)));
end
有没有更好的方法来解决这个问题?
修改 我想将双精度转换为整数的原因是因为这个列表在嵌入式系统中使用并最终转到16位DAC ......不允许双倍
答案 0 :(得分:2)
int16(vector)
将vector
从double
转换为int16
,这是首选方式。另一种方法是将所有常量定义为int16
s,在这种情况下,MATLAB会以int16
的形式给出结果。然而,这很麻烦,所以坚持你所拥有的(除非你绝对必须这样做)。
此外,与您的实际问题无关,您可以使用cumsum
放弃循环。我会留给你试试看:))