C++ 为什么过滤器的循环方向会改变结果?
我设计了一个简单的双通道滤波器,以消除给定频率下的一些噪声C++ 为什么过滤器的循环方向会改变结果?,c++,vivado,vivado-hls,C++,Vivado,Vivado Hls,我设计了一个简单的双通道滤波器,以消除给定频率下的一些噪声 #include "../include/Filter.h" void Filter(int DataIn, int* DataOut, bool Enable) { static coef_t Coefficients[] = { 0.0076925293, -0.039817952, 0.018740745, 0.013075141, -0.052312399, 0.0523
#include "../include/Filter.h"
void Filter(int DataIn, int* DataOut, bool Enable)
{
static coef_t Coefficients[] = {
0.0076925293, -0.039817952, 0.018740745, 0.013075141, -0.052312399,
0.052374545, 0.017044802, -0.14227364, 0.26541378, 0.68194015, 0.26541378,
-0.14227364, 0.017044802, 0.052374545, -0.052312399, 0.013075141, 0.018740745,
-0.039817952, 0.0076925293
};
static data_t ShiftRegRight[LENGTH];
static data_t ShiftRegLeft[LENGTH];
acc_t AccRight = 0x00;
acc_t AccLeft = 0x00;
if(Enable == true)
{
Shift_Accum_Loop: for(int i = (LENGTH - 1); i >= 0; i--)
{
if(i == 0)
{
ShiftRegRight[0] = DataIn & 0x0000FFFF;
ShiftRegLeft[0] = (DataIn & 0xFFFF0000) >> 0x10;
}
else
{
ShiftRegRight[i] = ShiftRegRight[i - 1];
ShiftRegLeft[i] = ShiftRegLeft[i - 1];
}
AccRight += ShiftRegRight[i] * Coefficients[i];
AccLeft += ShiftRegLeft[i] * Coefficients[i];
}
*DataOut = ((AccLeft.range() >> 0x20) << 0x10) | (AccRight.range() >> 0x20);
}
else
{
*DataOut = DataIn;
}
}
测试信号由测试台生成:
#include <math.h>
#include <stdio.h>
#include "../include/Filter.h"
#define SAMPLES 48000
#define FREQ_RIGHT_1 8000
#define FREQ_RIGHT_2 10000
#define FREQ_LEFT_1 50
FILE* File;
int main(void)
{
int Output;
int StreamData;
uint16_t RightChannel = 0x00;
uint16_t LeftChannel = 0x00;
File = fopen("Result.log", "w");
for(int i = 0x00; i < SAMPLES; i++)
{
// Generate the input data
RightChannel = 32767 * sin(2 * M_PI * i / (SAMPLES / FREQ_RIGHT_1)) * sin(2 * M_PI * i / (SAMPLES / FREQ_RIGHT_2));
StreamData = (LeftChannel << 0x10) | RightChannel;
// Execute the function with latest input
Filter(StreamData, &Output, true);
// Write the simulation results
fprintf(File, "%i, %d, %d\n", i, StreamData, Output);
}
fclose(File);
}
这两者有什么区别?在这两种情况下,循环的计数范围都是从0
到(长度-1)
,并且过滤器是对称的。为什么计数方向对结果有影响
if(i == 0)
{
ShiftRegRight[0] = DataIn & 0x0000FFFF;
ShiftRegLeft[0] = (DataIn & 0xFFFF0000) >> 0x10;
}
else
{
ShiftRegRight[i] = ShiftRegRight[i - 1];
ShiftRegLeft[i] = ShiftRegLeft[i - 1];
}
当您倒计时时,i==0
最后计算为true
当你计数时,
i==0
首先计算为真。与你的问题完全无关,但是Shift\u Accum\u循环
标签的作用是什么?您是否计划使用goto
?那就不要。如果您将其作为有关循环的“注释”,那么请改为编写适当的注释,解释循环的作用以及循环为什么这样做。至于您的问题,您是否尝试在调试器中逐个语句地逐步执行循环的不同实现?考虑一个赋值,比如ShiftRegRight[i]=ShiftRegRight[i-1]代码>,以及ShiftRegRight
数组的初始值可能是多少。@有些程序员说这个标签只是用于HLS指令,而不是用于某种goto
之类的东西。
if(Enable == true)
{
Shift_Accum_Loop: for(int i = 0; i < (LENGTH - 1); i++)
{
if(i == 0)
{
...
0, 0, 0
1, 28377, 27073
2, 0, 0
3, 0, 0
4, 0, 0
5, 37159, 38462
6, 0, 0
7, 37159, 38462
8, 0, 0
9, 0, 0
10, 0, 0
11, 28377, 27073
if(i == 0)
{
ShiftRegRight[0] = DataIn & 0x0000FFFF;
ShiftRegLeft[0] = (DataIn & 0xFFFF0000) >> 0x10;
}
else
{
ShiftRegRight[i] = ShiftRegRight[i - 1];
ShiftRegLeft[i] = ShiftRegLeft[i - 1];
}