int remotePlotData[100]; float r_f[100]; u16 remotePlotDataLen; u32 remotePlotDataAmp; const float FIR_TAB[72]={ 0.0f,-0.00012906f,-0.00022804f,0.0f,0.00055461f,0.00080261f,0.0f,-0.0015291f,-0.0020364f, 0.0f,0.0034223f,0.0043393f,0.0f,-0.0067311f,-0.0082564f,0.0f,0.012113f,0.014513f, 0.0f,-0.020472f,-0.024139f,0.0f,0.033213f,0.038823f,0.0f,-0.052964f,-0.061984f, 0.0f,0.086061f,0.10271f,0.0f,-0.15405f,-0.19757f,0.0f,0.40884f,0.82466f, 1.0f,0.82466f,0.40884f,0.0f,-0.19757f,-0.15405f,0.0f,0.10271f,0.086061f, 0.0f,-0.061984f,-0.052964f,0.0f,0.038823f,0.033213f,0.0f,-0.024139f,-0.020472f, 0.0f,0.014513f,0.012113f,0.0f,-0.0082564f,-0.0067311f,0.0f,0.0043393f,0.0034223f, 0.0f,-0.0020364f,-0.0015291f,0.0f,0.00080261f,0.00055461f,0.0f,-0.00022804f,-0.00012906f }; #define FIR_BLOCK_SIZE (1024/8) static float FIRState[FIR_BLOCK_SIZE+24-1]; void DispPlot(float *dat,u32 count,u32 period) { int i;float scale,mid; arm_fir_interpolate_instance_f32 fir_def; arm_fir_interpolate_init_f32(&fir_def,3,72,(float*)FIR_TAB,FIRState,FIR_BLOCK_SIZE); for(i=0;i<FIR_BLOCK_SIZE+24-1;i++) { FIRState[i]=0; } arm_fir_interpolate_f32(&fir_def,dat,FIROutputBuffer,FIR_BLOCK_SIZE); //arm_fir_interpolate_f32(&fir_def,dat+FIR_BLOCK_SIZE,FIROutputBuffer+FIR_BLOCK_SIZE,FIR_BLOCK_SIZE); int zero=FindZeroIndex(FIROutputBuffer+40,count)+40; if(period==0)return; maxX=period; period=period*34/10; //zero+=period; if(zero+period>count)zero=0; if(zero+period>count)period=count; maxY=1.5;minY=-1.5; Plot(100,0,240,120,FIROutputBuffer+zero+50,period*2,false); //Plot(80,0,240,120,dat,count); Plot(100,120,240,120,fft_inputbuf,count/2,true); minY=findMin(FIROutputBuffer,FIROutputBuffer+count);maxY=findMax(FIROutputBuffer,FIROutputBuffer+count); remotePlotDataAmp=(maxY-minY)/2.0f*1000.0f; scale=255.0f/(maxY-minY);mid=(minY+maxY)/2; if(period<=100) { remotePlotDataLen=period; for(i=0;i<period;i++) { remotePlotData[i]=(FIROutputBuffer[zero+i]-mid)*scale; } }else{ remotePlotDataLen=100; for(i=0;i<100;i++) { remotePlotData[i]=(FIROutputBuffer[zero+i*period/100]-mid)*scale; } } for(i=0;i<remotePlotDataLen;i++) { r_f[i]=remotePlotData[i]; }
时间: 2024-04-21 16:24:39 浏览: 136
这段代码是一个用于绘制信号波形的函数。代码中使用了一个FIR滤波器来对输入数据进行滤波,然后将滤波后的数据进行绘图显示。具体流程如下:
1. 定义了一个长度为100的整型数组remotePlotData,用于存储绘图数据。
2. 定义了一个长度为100的浮点型数组r_f,用于存储绘图数据的副本。
3. 定义了两个变量remotePlotDataLen和remotePlotDataAmp,分别用于记录绘图数据的长度和振幅。
4. 定义了一个常量数组FIR_TAB,该数组是FIR滤波器的系数。
5. 定义了一个长度为FIR_BLOCK_SIZE+24-1的静态浮点型数组FIRState,用于存储FIR滤波器的状态。
6. 定义了一个名为DispPlot的函数,该函数用于绘制信号波形。
7. 在函数内部,使用arm_fir_interpolate_init_f32函数初始化一个FIR滤波器。
8. 对FIRState数组进行初始化。
9. 调用arm_fir_interpolate_f32函数对输入数据进行滤波。
10. 根据输入数据的长度和周期计算绘图的最大值和最小值。
11. 调用Plot函数绘制信号波形。
12. 将绘图数据存储到remotePlotData和r_f数组中。
请注意,以上仅是对代码的简单解释,具体的功能和使用方式还需要根据整个程序的上下文来进行理解。如果您有其他问题,请随时提问。
相关问题
把这段代码从c++转换为c代码Rect<float> Framer::ComputeActiveCropRegion(int frame_number) { const float min_crop_size = 1.0f / options_.max_zoom_ratio; const float new_x_crop_size = std::clamp(region_of_interest_.width * options_.target_crop_to_roi_ratio,
把这段 C++ 代码转换成 C 代码并不是一件简单的事情,因为 C++ 和 C 有许多语法上的不同,C++ 有许多 C 中没有的特性,例如模板、类和命名空间等等。因此,我们需要对代码进行适当的修改和调整。以下是将 C++ 代码转换为 C 代码的一种可能的方式:
```c
struct Rect {
float x, y, width, height;
};
struct FramerOptions {
float max_zoom_ratio;
float target_crop_to_roi_ratio;
};
struct Framer {
struct Rect region_of_interest_;
struct FramerOptions options_;
};
float clamp(float value, float min_value, float max_value) {
if (value < min_value) {
return min_value;
} else if (value > max_value) {
return max_value;
} else {
return value;
}
}
struct Rect ComputeActiveCropRegion(struct Framer *framer, int frame_number) {
const float min_crop_size = 1.0f / framer->options_.max_zoom_ratio;
const float new_x_crop_size = clamp(framer->region_of_interest_.width * framer->options_.target_crop_to_roi_ratio, min_crop_size, 1.0f);
struct Rect active_crop_region;
active_crop_region.x = framer->region_of_interest_.x + (framer->region_of_interest_.width - new_x_crop_size) / 2.0f;
active_crop_region.y = framer->region_of_interest_.y;
active_crop_region.width = new_x_crop_size;
active_crop_region.height = framer->region_of_interest_.height;
return active_crop_region;
}
```
需要注意的是,C 中没有命名空间的概念,因此我们将结构体 `Rect`、`FramerOptions` 和 `Framer` 放在了全局命名空间中。另外,C 中没有 `std::clamp` 函数,我们需要手动实现一个 `clamp` 函数来实现相同的功能。最后,建议根据实际情况对代码进行适当的调整,以便更好地适应 C 语言的语法和特性。
class NUMBER_DETECTION { public: int init(const char* modeltype, int num_threads); int detect(const cv::Mat& rgb, std::vector<Object>& objects, float prob_threshold = 0.5f, float nms_threshold = 0.45f); void load_model(const cv::Mat& rgb, std::vector<Object>& objects); int destroy() { return 0; } private: void generate_proposals(const ncnn::Mat& anchors, int stride, const ncnn::Mat& in_pad, const ncnn::Mat& feat_blob, float prob_threshold, std::vector<Object>& objects); private: ncnn::Net yolov7; int num_threads = 4; float norm_vals[3] = { 1 / 255.f, 1 / 255.f, 1 / 255.f }; //���� float anchors0[6] = { 12.f,16.f, 19.f,36.f, 40.f,28.f }; float anchors1[6] = { 36.f,75.f, 76.f,55.f, 72.f,146.f }; float anchors2[6] = { 142.f,110.f, 192.f,243.f, 459.f,401.f }; /*float anchors0[6] = { 4.f,5.f, 6.f,8.f, 10.f,12.f }; float anchors1[6] = { 15.f,19.f, 23.f,30.f, 39.f,52.f }; float anchors2[6] = { 72.f,97.f, 123.f,164.f, 209.f,297.f };*/ };
这是一个名为 `NUMBER_DETECTION` 的类,其中包含了一些公共和私有成员函数以及私有成员变量。
公共成员函数包括:
- `int init(const char* modeltype, int num_threads)`:用于初始化模型,并设置线程数量。
- `int detect(const cv::Mat& rgb, std::vector<Object>& objects, float prob_threshold = 0.5f, float nms_threshold = 0.45f)`:用于在给定的图像中检测数字。它返回检测到的数字对象,并可以指定概率阈值和非最大值抑制阈值。
- `void load_model(const cv::Mat& rgb, std::vector<Object>& objects)`:用于加载模型,并加载图像和对象。
私有成员函数包括:
- `void generate_proposals(const ncnn::Mat& anchors, int stride, const ncnn::Mat& in_pad, const ncnn::Mat& feat_blob, float prob_threshold, std::vector<Object>& objects)`:用于生成候选框,并使用概率阈值筛选候选框。
私有成员变量包括:
- `ncnn::Net yolov7`:一个私有变量,表示用于数字检测的模型。
- `int num_threads`:一个整数私有变量,表示线程数量。
- `float norm_vals[3]`:一个包含3个浮点数的数组,表示图像的归一化值。
- `float anchors0[6]`、`float anchors1[6]`、`float anchors2[6]`:三个包含6个浮点数的数组,表示用于生成候选框的锚点值。
这个类似乎是用于数字检测的实现,它包含了初始化、检测、加载模型和销毁等功能。
阅读全文