我是做audio coding的,想通过filter把输入信号变小。问题来了,有的时候滤波之后的信号是变小的,有的时候不是。我就在查,然后发现:在文件开头,
#define N 2048 /* frame shift */
#define W N+1024 /* frame size */
这样写,滤波之后信号energy变小
#define N 2048 /* frame shift */
#define W 3072 /* frame size */
这样写,滤波之后信号energy变大
其他地方都没有改,请问这个是Borland C++ Builder 6的问题,还是我程序写的时候有问题?我不知道为什么我写的程序会跟预定义的W的值有关系
再有就是,在后面的程序里,如果我写
for (j=0;j<W-NN;j++)
winbuf[j]=winbuf[NN+j];
for (j=W-NN;j<W;j++)
winbuf[j]=nbuf[(W-N)/2+subframe+j-W+NN];
滤波之后信号energy变小,
如果写
for (j=0;j<N-NN+1024;j++)
winbuf[j]=winbuf[NN+j];
for (j=N-NN+1024;j<N+1024;j++)
winbuf[j]=nbuf[(W-N)/2+subframe+j+NN-N-1024];
滤波之后信号energy变大
如果把上面的改成
for (j=0;j<N-NN+1024;j++)
winbuf[j]=winbuf[NN+j];
for (j=N-NN+1024;j<N+1024;j++)
winbuf[j]=nbuf[(W-N)/2+subframe+j+NN-W];
滤波之后信号energy变小,
再如果把上面的改成
for (j=0;j<N-NN+1024;j++)
winbuf[j]=winbuf[NN+j];
for (j=N-NN+1024;j<N+1024;j++)
winbuf[j]=nbuf[(W-N)/2+subframe+j+NN-(W)];
滤波之后信号energy变大
包括之前遇到过一些问题,更改文件名或者某个函数名以后,就解决了。。。
到底是为什么呢,请教各位大虾了!!!
13 个解决方案
#1
帮你顶,是不是预定义顺序的问题?
#2
可是先定义的N后定义的W啊
而且不是因为W=N+1024有问题,是直接写W=3072有问题
先谢谢你哈
#3
按照C语言,预定义好像是直接代入
subframe+j-W+NN会被替换成subframe+j-N+1024+NN,
所以被改变了。
subframe+j-W+NN会被替换成subframe+j-N+1024+NN,
所以被改变了。
#4
你说的确实是一个问题,我再看看我程序还有类似的问题没有,因为现在的情况是,写正确的预定义,结果是错误的,写错误的预定义,结果更好
麻烦看一下http://topic.csdn.net/t/20040404/14/2923532.html的74楼
请问这又是为什么呢,第一个问题我也遇到过
#5
是你的问题
#define N 2048 /* frame shift */
#define W N+1024 /* frame size */
这样写,滤波之后信号energy变小
#define N 2048 /* frame shift */
#define W 3072 /* frame size */
这里的for (j=0;j<W-NN;j++)
winbuf[j]=winbuf[NN+j];
NN是不是被替换成:20482048?
你把NN换成nn看看
#define N 2048 /* frame shift */
#define W N+1024 /* frame size */
这样写,滤波之后信号energy变小
#define N 2048 /* frame shift */
#define W 3072 /* frame size */
这里的for (j=0;j<W-NN;j++)
winbuf[j]=winbuf[NN+j];
NN是不是被替换成:20482048?
你把NN换成nn看看
#6
应该不是这个问题,我有#define NN 16 而且有输出过来看,NN确实是16
#7
呵呵
#define W (N+1024)
#define W (N+1024)
#8
好,注意使用括号
#9
细致细节
#10
#11
不会的预定义转换是对整个标识符,不会将标识符的一部分转换。
#12
#define W (N+1024) /* frame size */
#13
谢谢楼上几位,加括号确实是应该加的
关于其他问题呢,还请有经验的朋友帮忙解答一下啊!
关于其他问题呢,还请有经验的朋友帮忙解答一下啊!
#1
帮你顶,是不是预定义顺序的问题?
#2
可是先定义的N后定义的W啊
而且不是因为W=N+1024有问题,是直接写W=3072有问题
先谢谢你哈
#3
按照C语言,预定义好像是直接代入
subframe+j-W+NN会被替换成subframe+j-N+1024+NN,
所以被改变了。
subframe+j-W+NN会被替换成subframe+j-N+1024+NN,
所以被改变了。
#4
你说的确实是一个问题,我再看看我程序还有类似的问题没有,因为现在的情况是,写正确的预定义,结果是错误的,写错误的预定义,结果更好
麻烦看一下http://topic.csdn.net/t/20040404/14/2923532.html的74楼
请问这又是为什么呢,第一个问题我也遇到过
#5
是你的问题
#define N 2048 /* frame shift */
#define W N+1024 /* frame size */
这样写,滤波之后信号energy变小
#define N 2048 /* frame shift */
#define W 3072 /* frame size */
这里的for (j=0;j<W-NN;j++)
winbuf[j]=winbuf[NN+j];
NN是不是被替换成:20482048?
你把NN换成nn看看
#define N 2048 /* frame shift */
#define W N+1024 /* frame size */
这样写,滤波之后信号energy变小
#define N 2048 /* frame shift */
#define W 3072 /* frame size */
这里的for (j=0;j<W-NN;j++)
winbuf[j]=winbuf[NN+j];
NN是不是被替换成:20482048?
你把NN换成nn看看
#6
应该不是这个问题,我有#define NN 16 而且有输出过来看,NN确实是16
#7
呵呵
#define W (N+1024)
#define W (N+1024)
#8
好,注意使用括号
#9
细致细节
#10
#11
不会的预定义转换是对整个标识符,不会将标识符的一部分转换。
#12
#define W (N+1024) /* frame size */
#13
谢谢楼上几位,加括号确实是应该加的
关于其他问题呢,还请有经验的朋友帮忙解答一下啊!
关于其他问题呢,还请有经验的朋友帮忙解答一下啊!