This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/SW-EK-TM4C1294XL:1-D 快速小波变换算法

Guru**** 2601915 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/742689/ccs-sw-ek-tm4c1294xl-1-d-fast-wavelet-transform-algorithm

器件型号:SW-EK-TM4C1294XL

工具/软件:Code Composer Studio

我正在从 PWT 传感器采样 H宁 脉冲。 我需要对采样波形进行波长变换。 我编写了一个非常基本的代码、用于循环、通过将缩放的时间移波长相乘来实现1-D 连续波长的传输。 但代码非常慢、大约需要20分钟才能找到小波变换。 我用于1-D CWT 的波长是莫莱特波长。 是否有更好的算法来实现波长变换。 如果是、则是可用的示例代码或一些引用、它们在其中解释了算法。 是否有能够执行 perfom1-D 波长变换的库?  

我附加了我编写的函数。 数组 g_ui8RxBufA[]包含从 ADC 采样的波形。

void CWT (uint32_t scale)
{
uint32_t p、j、k、l;
对于(l = 0;l < 512;l++)
{
SIGNAL [l]=(float32_t) g_ui8RxBufA[l]*(3.3/4096.0);
}

for (p=1;p<=scale;p++)
{
for (j=0;<CWT_LENGTH;j++)
{
for (k=0;0.<CWT_LENGTH;k++)
{
cos_1 = cos (5*((k-j)/p));
sqrt_1 = sqrt (p);
temp_p =(float32_t) p;
temp =(-1*((k-j)/temp_p)*((k-j)/temp_p))/2;
EXP_1 = exp (temp);
temp_wavelet = exp_1_cos_1/sqrt_1;
cefs[p-1][j]= cefs[p-1][j]+ SIGNAL [k]*temp_wavelet;
}
}

} 

感谢您的帮助!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您的问题非常具体。 确保使用硬件浮点支持和高级 C 编译器优化。 (默认为硬件浮点和优化级别2。) 我对算法没有任何建议。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    除了 Bob 所说的启用硬件浮点支持之外、Cortex-M4F 仅支持单精度(32位)硬件浮点。 必须使用较慢的软件浮点执行双精度(64位)浮点计算。

    代码片段隐式使用一些双精度计算、因为:

    a)"3.3"等不后缀的浮点常量隐式双精度。

    b)调用 cos、 sqrt 和 exp 数学函数、这些函数采用双精度参数。

    可以通过以下方式更改代码以执行单精度计算、从而提高速度、但降低精度:

    a)向浮点常量添加"f"后缀。

    b)调用 采用  单精度参数的 cosf、sqrtf 和 expf 数学函数。

    即、建议的代码更改如下:

    void CWT (uint32_t scale)
    {
    uint32_t p、j、k、l;
    对于(l = 0;l < 512;l++)
    {
    SIGNAL [l]=(float32_t) g_ui8RxBufA[l]*(3.3f/4096.0f);
    }
    
    for (p=1;p<=scale;p++)
    {
    for (j=0;<CWT_LENGTH;j++)
    {
    for (k=0;0.<CWT_LENGTH;k++)
    {
    cos_1 = cosf (5*((k-j)/p));
    sqrt_1 = sqrtf (p);
    temp_p =(float32_t) p;
    temp =(-1*((k-j)/temp_p)*((k-j)/temp_p))/2;
    EXP_1 = expf (temp);
    temp_wavelet = exp_1_cos_1/sqrt_1;
    cefs[p-1][j]= cefs[p-1][j]+ SIGNAL [k]*temp_wavelet;
    }
    }
    
    }