|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 & v( I# s! F' C( g5 E1 D
! u/ ]5 X: U/ _- O
各位大神:
0 K) }8 b! Y7 h z: W 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
" y3 a5 c+ O. E6 F# @ 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:6 _+ V- d3 T- @8 k6 ]$ K0 j
! e$ Y6 i$ T! V: P( G
/ B- k4 H. S: `. K N
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
+ `2 A. d6 n3 f2 x
+ }) [3 X3 n* A; a并没有其他线程! x( U. g( }; C) D4 ~8 w
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
3 J, R$ l; O3 a+ D也说不定是和堆栈有关系。。。。。。
; P# A) a: G# n& ]请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数..../ Z9 a' B8 Y5 _( r- \& M0 n
+ w: |" r; r% r' [1 z) T
6 O3 ?# Q! t/ f) Q6 d `6 I; B* n4 U1 `' |1 Q2 ?
我也很绝望啊,希望大神能帮帮忙,感激不尽,!/ ~# J, A& T+ ?9 r5 U
, o, @# i& ?. c3 n9 }. o3 t/ {; c! ]
) u6 M" I8 Z' \
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];- L8 y1 ^8 u" C! b! X$ z$ c) p. c
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。; j, O( s5 \5 n! d# Z. H; a
' A5 Z. x5 G. |2 ?boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC( U* @8 g- C8 }6 `( G/ o6 j
const double data1000[1000]) {/ u1 E. h& G y
% U2 h, ^1 @: r3 M- l
int myfuck; H: P1 p0 @* l2 [ B/ Q _5 }' ~
double yiDuanShuJu_mean;
! @0 P+ g: h: }+ l double yiDuanShuJu_LowMean[1000];
, {6 v) q' }% x2 O3 \, i int ixstart;1 N% X* D- U& H$ r. v+ Y7 _
double dv0[1000];- ^; V5 O8 x" _" Y
comm_AGC pAGC;
9 I0 l! G' R* M$ i comm_CarrierSynchronizer pFineFreqCompensator;9 B. ~; U. }- O/ C5 o$ {3 B+ Y
dspcodegen_FIRDecimator pRxFilter;6 U5 J$ J" Z8 A$ A
comm_SymbolSynchronizer pTimingRec;3 x" k0 u3 I( q
comm_PreambleDetector pPrbDet;3 V( f9 s% ?2 X8 I6 k
FrameSynchronizer pFrameSync;4 U; F& F2 Z8 M
QPSKDataDecoder pDataDecod;' o. Y: F9 f+ k Q J! G
static double usable_left_filtfilt[81000];
. F( r$ ]3 i5 i" h5 k0 ?$ ]# l$ s7 p static double youXiaoShuJu_QuZhiLiu[81000];
& o. c8 w, U$ V# n double mtmp;
( x; D, @8 f$ v5 D int ix;
: R) O# k& [ O: h, k boolean_T exitg2;+ Z( ?0 ~/ h& w" u# r: c( D& i: X
boolean_T exitg1;2 L+ j' V/ C6 Y/ O$ X3 a- T
double YiZhenShuJu[800];2 y2 i0 ?) k: {2 J9 y2 Q$ ^
double dv1[800];
* Q" k: L r; e3 p# k9 y! S; l! L3 n, T2 u
( Z D1 c* O+ B3 K9 G
double b_YiZhenShuJu[800];
, ]8 y7 ?7 c- [0 d double I_filtfilt[800];$ y2 O2 G- x- Q8 f
double Q_filtfilt[800];
$ b7 r2 h; f+ X w8 f8 n* u% x creal_T b_I_filtfilt[800];7 _# c, M8 t* N6 p/ B/ F6 m
creal_T b[800];
% w/ d, Z; F1 E. c creal_T RCRxSignal[50];
7 R' W3 q; Q3 @* a6 C3 j creal_T fineCompSignal[50];
2 `5 {$ v/ Z4 f, b; U double phError[50];- D, Z2 M2 [. G5 F: {) g
creal_T timingRecSignal_data[28];
9 C. V2 @* f! i# [! J6 e3 W int timingRecSignal_size[1];
" Z+ h8 {6 W s2 @ double prbIdx_data[28];
5 H8 [3 b1 Q( t$ r int prbIdx_size[1];; \' T5 i6 m o9 L h) W8 X" s" i
double dtMt_data[28];. S! [1 |" E) F
int dtMt_size[1];
: V% E) G# y" x creal_T symFrame[25];
* ^8 U& U8 g1 v( {; s# l boolean_T isFrameValid;
% W* T9 E% {3 F" E double unusedU0[3];# p. {0 H9 V! ]: b" i: j) e
* s0 @. J9 f: d6 O' [
//调试过程中的变量
2 Z1 g- o. \& e5 W8 Y/ e4 T int enough_data;
' g: j1 z$ q2 Z* ~' G# W0 O8 g! @- ] l5 P& v( z* f
int enoughDataFlag;& F+ j- t9 j' s1 d4 v: k1 y
int yiDuanShuJu_mean_int;
" X( f! _# s5 o& o* Y int int_sum_dv0;7 M; n. q5 }$ X5 f/ N) x
int oo;
: ?- \: `' i: j. _. \1 i' ?; @3 J( u int ii;
2 ^ D2 }" {! Y% `' y myfuck=10;
" l& p# o* v2 B: D- E" g2 z /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
0 ? s; |6 k- m/ y/ x( L7 h /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
9 T# k% \+ E" Z9 l/ R
3 F7 i7 s' H5 f* H$ c yiDuanShuJu_mean = mean(data1000);
: d+ ~. j( D6 H* ^
0 Q+ W/ D P* ?- \ yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;/ A) r' _! _9 @, S8 z. L# K9 ^
UARTPutc('A');5 v" [! e4 t" a4 n p# w" g' l J
UARTPutNum(yiDuanShuJu_mean_int);9 C! b/ W8 X" z! n) c, @/ a
UARTPutc('\r');
2 l6 W, c# B8 |# w, H0 I UARTPutc('\n');5 c& [* y' y6 ~
' @: S- F" E3 {$ q. i& T* U6 P for (ixstart = 0; ixstart < 1000; ixstart++) {
! G' A& T2 F; V% j9 p' l1 k yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
5 m- x; I! y# r, l. k$ B. |' Z6 m }
" y8 a+ f _; b3 I! A0 v
/ `4 E! W1 r0 p: ^+ a( w% u power(yiDuanShuJu_LowMean, dv0);
- ]( \* T4 [1 W9 }3 p ]1 i8 c0 z. z4 d+ Y) f9 c+ G
int_sum_dv0 = (int) sum(dv0);
/ u$ n% }' `) O: r2 f, i+ p* D
; s! d6 v# }6 c" K UARTPutc('B');& S3 I; u- n3 M4 }- G5 q- y6 C
UARTPutNum(int_sum_dv0);
; L1 O! ]4 H" W6 A' ]+ {2 x( W& D a UARTPutc('\r');
7 f. |2 l) T+ X) p- M" w UARTPutc('\n');% c8 R6 q2 i9 c& ^
; c, ^% M% Y3 a K; ?" P3 o8 n+ s) B
// int compareFlag = int_sum_dv0 > 1.0E+8;2 j1 D# B/ T6 I- M, D( g4 l% g: `" U
0 q/ M, O2 A O7 y
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
/ X' q$ h5 Q4 p- f" j2 O UARTPutc('C');. p- [* C, @) m* M
/* 比较信号能量 */ g/ M2 R" Y" y# a# p2 ?2 z1 v
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */+ D5 o1 Z* w. l! G" m* d8 m
// yiDuanShuJu_mean = 1000.0 * youxiao_k;1 t+ |, i$ S F9 x* d) ^
// for (ixstart = 0; ixstart < 1000; ixstart++) {- [. T, U% p6 g/ f1 h7 Q
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =4 |) ^0 l" J8 E/ v
// yiDuanShuJu_LowMean[ixstart];
! g w$ W7 j1 K& T0 P// }/ w+ R3 @' j Z* p: R
//
4 h/ U9 P0 `8 H5 X3 v) a// youxiao_k++;# ?- K1 l- ^0 F
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
7 V; V3 S* a x n* w p* p% P! T// /* 感觉要取21个数,即0-20, */$ s, S* ^: t. y
// enough_data = 10;//有效是10,无效是0
7 U" e0 d: P' `. t( H( p8 D# @" b// }4 C# w6 a. i1 D: E4 @7 r
}8 [, `9 X- x& s% O! I! V
% ?% ^* Q3 @& G
* ^& l( Q) j5 Q
enoughDataFlag = 100;2 ?' d+ O! |4 c4 N) L% n
enoughDataFlag = 1000;
B9 y; z( G6 g% O% w/ A& ] enoughDataFlag = 0x02;3 `5 C" l0 b2 h- ~8 |8 ^
enoughDataFlag = 200;
2 K) d; v+ F* ]8 c/ w9 m7 P! V: j- _4 [7 O; d
int myfuvk1;
1 |/ [) `' I: _ }: y myfuvk1 =11;
- H7 v1 t) \9 M0 o) H7 K
* Z; i4 h, x2 @# m9 E8 l- Y, u8 m4 g- L7 u- g6 h4 \# A
enough_data = 0;9 Q9 r( R/ }7 y& h! E
0 v5 ^+ \5 I9 ~8 ~* i0 B H// if(enough_data>50){: R) [( W- k* \& a* [% Q4 {% C
// enoughDataFlag=0x01;/ G7 \5 `6 g& ]
// }else if(enough_data<50){
; M3 \& ?/ F) u1 D, Q8 h// enoughDataFlag=0x00;//0x00还是不行6 Y+ ]' v6 @. j M9 P' @& `
// }
$ c$ ^6 [8 Q. E' {3 i: ^' {: p9 ~# P' o) v+ Q. G
& \9 t( J! L$ A
oo=10;
6 ]( O# w% L/ D2 j2 N2 U oo = oo < 5;
4 d! F( D* K/ _- ?6 [ if(oo){
7 o) s ` y# } ii=0;
& E7 g5 D& T! T7 [ }) Q" `' P b. l/ n
if(oo < 5){' d% p/ W4 K1 D# w0 [
ii=0;
4 [2 I$ Z) ~, d" | }
& ^ Z6 P2 t* t6 v, E if(oo > 5){
3 X b9 r) j! x7 c% v) w5 y9 D ii=0;
4 t' k5 Q$ q$ A. d" q0 g$ v2 K }
3 ^+ y' Y+ _! G* w8 r4 |+ A6 _) S7 i2 M) [& s2 [
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
) b. T; ^/ e+ h /* 如果数据足够才执行主程序 */, q# ^0 U: {5 s" o! Z8 s7 \
oo = oo < 5;- V5 l6 @ K1 }
enoughDataFlag = enoughDataFlag < 5;$ ?: c( |( I1 k& w' ?
if (enoughDataFlag < 5) {
s0 B- i. e( u/ }) w _// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
# `8 @# L+ C. d, L, T AGC_AGC(&pAGC);
% ]* h1 \1 _. _ f; g. Q+ n
1 m) K3 s3 D( p) D0 ? c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);3 [1 x( M7 S% X$ m) N# w( }5 c# a# B
FIRDecimator_FIRDecimator(&pRxFilter);& F' [/ c- @4 K* `' B+ Y
. _4 i) t; M4 c
/* Downsampling */" }9 E. P0 M4 h5 `
c_SymbolSynchronizer_SymbolSync(&pTimingRec);# W7 {5 z5 I" ~; ^3 K U
% l) t" Z4 r+ ]- r$ [
c_PreambleDetector_PreambleDete(&pPrbDet);
5 _# w2 O3 ~6 F* `* v
* D0 k: |: d4 M, N A /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */6 K- q* c Y0 D- s
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
7 j7 A4 ^; X0 V- M /* %帧数量=100 */
; N0 {1 h) [5 ~4 C# D* q pFrameSync.isInitialized = 0;
5 T9 J p- B' x3 Y6 c
# T9 s/ E5 j; T3 {* g2 R5 t z /* [EOF] */
% v8 \9 R( Y" b /* 前导码长度是13 */6 ^# B3 x8 d( w
/* %qpsk */
5 a i& M! }" X5 r pDataDecod.isInitialized = 0;/ k O1 p [) n4 Y: ?, d
+ d, @2 E1 K2 e' ^ /* end *// K- W+ Y- O K0 G! y: Q, t7 Q6 b
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */' J1 a/ z! d# W
/* Convert 3-dB frequency */
) p% Q, [5 Z7 P( b0 c& ?) \ /* Convert 3-dB frequency */
( T0 A; N4 D. n, @* j0 y1 l9 G filtfilt(save_buffer, usable_left_filtfilt);
! E7 |; ?8 S1 ^ for (ixstart = 0; ixstart < 81000; ixstart++) {
; `5 H8 g% L" n- k6 I, ? usable_left_filtfilt[ixstart] *= 2.0;* m; v0 k# d; h( T8 p$ O* w
}" r( H* R3 T* ^$ I0 Y
4 ]2 `% `1 u( C: a) B
/* 注意乘2,处理幅度 */
H$ Y7 Z% w) m /* %% 我发现带通之后其实就均值为0了,不用这一步了 */$ z+ ~8 O8 C: [! s. F$ T
/* %% 行列转换 *// v* t4 {1 k, z/ W' w# B5 F p
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);- z9 W; ?; x& L- G- A# V: {+ @
for (ixstart = 0; ixstart < 81000; ixstart++) {
! A0 E+ B/ {; w! A/ x" u9 D9 | youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]# ~& J' z7 q }( |5 ]4 ]
- yiDuanShuJu_mean;+ K+ Z' W6 P m. |
}
% g, A4 ?5 Q6 O- N* f o. v7 c6 E$ h1 n% B( y, [* e) [5 {/ {
/* %% 应该对数据归一化,但是这一步放在哪比较好 */) x' {# ]4 ]( R1 h
ixstart = 1;
0 \* `; u# [, M* ?6 g1 a6 c x mtmp = youXiaoShuJu_QuZhiLiu[0];
. i8 i- p( o3 f7 L) e if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {; X" e+ T, N4 H9 a! u/ d. T) @) G* M# }
ix = 2;% }6 X0 O0 h! z9 L7 A: O' \" V
exitg2 = false;
! X$ @7 e( d6 w: E( T# g while ((!exitg2) && (ix < 81001)) {% O" X1 P3 \0 q( A& J
ixstart = ix;
: g7 e, |9 \( o3 c if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
) g u$ ~2 u t2 o2 B3 q" ^$ c mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
- ?1 O5 g8 P2 Q exitg2 = true;( h% |4 f/ l7 Q, d/ ~4 P. d' o/ b
} else {+ o$ q" t$ \" j9 q9 |$ \* ?
ix++;
, B9 ~* Q0 _7 E, o7 _& q }2 W! C0 h8 D9 a& z
}
' \: P6 J. u. m" I }
, ]' x- Y$ J$ Z/ Y, ]4 Y
+ f! q7 j9 R! [7 y9 a if (ixstart < 81000) {; b; r* h" @+ c1 k0 ?7 T6 K
while (ixstart + 1 < 81001) {' o- n8 _9 |' e3 ^" N; y) Y
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {/ I: W; f/ x: n, R. K% `
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];) a! t9 h4 J) w. d5 h
}
$ c, @4 w9 T1 o/ | K
& W7 e$ v6 D. A8 p ixstart++;
) }1 P& | x1 J8 W }( ?% I4 t) [$ l, ~- M( [
}
) Q$ `4 o1 q% { T1 z: R
4 e' q3 J! q7 ~% K8 s; o+ f ixstart = 1;
! F: x6 o3 E' h6 n0 | @ yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
- @5 F" K0 ^; V' Y/ H0 I( h v if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {1 k) k: O* ]7 }1 w
ix = 2;& W7 I6 E. d7 g- m* S7 I
exitg1 = false;9 S- v9 Y+ M8 m$ _
while ((!exitg1) && (ix < 81001)) {5 K8 J/ J7 T7 e% J
ixstart = ix;1 A/ x4 V6 U0 p% I
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
5 ?$ T p p9 N0 p: q5 b yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
* c- @. \" ~+ t exitg1 = true;( ~7 r0 P, N* g9 V: ?
} else {/ m5 Y3 E4 |; q$ J) U, C5 J) L
ix++;
9 g. Z+ n2 ^: P5 ~5 g& L" l$ e }& ?: B; n9 y5 g& G: ~2 j
}
$ m. Y0 Y$ b$ j5 [* N; U' k; J) k }
8 k% v* A+ n1 v1 ~9 N
s+ A8 Q# E. u2 R3 R$ j$ F2 T; V if (ixstart < 81000) {
+ |# z! ?- H' b5 w- j9 j3 R! o while (ixstart + 1 < 81001) {
0 N! ^, p* h) b/ V if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
4 Z, Y& G0 Y1 O1 e1 } yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];: ^" F$ F- r) m
}
5 [% G) k2 g( q" g% A& m- h) w& z4 W6 V
ixstart++;4 m4 H7 q5 \7 B
}& R- ]* ~1 E0 K; e* \7 x, p% D
}6 P& M8 |9 C; v
; K: u# B2 a5 u- X, {( V, F' [ yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
3 K9 H% \! n; ^9 v& @0 C" t1 r if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
: ]7 Y0 e% N, _5 x8 ~* [ yiDuanShuJu_mean = mtmp;
3 }' G0 K7 _# o; e }
7 k' M8 J ]0 d3 o" ]# C% ?4 [6 p3 H/ N/ `
/* 找出极值 */$ ~/ f+ ^) e$ i. k! I: q
for (ixstart = 0; ixstart < 81000; ixstart++) {2 \( x, x8 _; C. X1 y: f
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
3 _0 p2 S7 ?6 K, u4 U( Z( y- V }
+ L/ L* {% z* p% e" V% V0 c6 }$ {5 R- Y* K: F- V( I: @
--------------帖子字数限制------------------& B. F' \% s l: ^! ~/ u6 L
}" l9 O0 l8 q+ u$ B7 ^
* B+ t& S. I4 U7 {3 l# _6 S2 @8 c q6 r8 [6 c+ F6 w6 s2 b8 P
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|