加倍到int16(生成或转换?)

时间:2011-08-01 20:32:36

标签: matlab double

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 ......不允许双倍

1 个答案:

答案 0 :(得分:2)

int16(vector)vectordouble转换为int16,这是首选方式。另一种方法是将所有常量定义为int16 s,在这种情况下,MATLAB会以int16的形式给出结果。然而,这很麻烦,所以坚持你所拥有的(除非你绝对必须这样做)。

此外,与您的实际问题无关,您可以使用cumsum放弃循环。我会留给你试试看:))