|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
& B3 m2 ^- o; F; e6 V# o9 L5 a/ ^
* I4 _. B4 O% K2 u各位大神:* g0 D2 K1 b7 T R1 P2 k
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
6 L5 f% z! n4 l 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
4 E/ ?% f( T& t/ Y5 I! t' s. g/ z) K/ h; Y$ O; a1 z
1 f6 [" J: I8 U0 [' v2 }这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
* e/ X# ?- ]- A0 t% _: A3 {1 q
+ f; O: @) K j6 u并没有其他线程8 u' U* ?9 j$ w( z( e
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。7 R4 h! P; I- e& K! I
也说不定是和堆栈有关系。。。。。。
' p( b* z3 `- ~& Y' W1 J E请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....' o1 t9 ]/ _! m4 b% Q9 Y- W4 `3 y! D
. [3 w6 K6 @3 c
6 \* N J5 Z' s7 s
8 q8 X& W3 X0 I- s7 ^ C* Q, @我也很绝望啊,希望大神能帮帮忙,感激不尽,!
9 T% Z& Y( V9 P/ b. D* g# C& U- n; b( d9 N$ d. D) |* o9 E+ l3 N
6 E: x+ ~! s7 R; @附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];2 Q0 e" I' \* k& E
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。* Q+ B+ H5 ~; }4 J; P' p
1 K" Y% ~& x5 A' nboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
+ u8 m1 d! A7 h9 s2 ^ const double data1000[1000]) {# k: w* N- K# X* \. Z
+ {& u: ?" d5 ]) z( b! } int myfuck;8 \0 v- U7 H$ C! U+ w: F& P% k$ m
double yiDuanShuJu_mean;
8 i" r6 ]& ~" ^* n( ~ _ double yiDuanShuJu_LowMean[1000];6 x! h$ i1 e( A! M c' A# d
int ixstart;
0 I# y+ _' S+ U4 M8 H6 |0 j5 V double dv0[1000];
1 i/ ]0 ~7 R9 v* I" E* T; f* m5 X comm_AGC pAGC;( i3 k! E2 T8 s0 _0 Y9 W/ U
comm_CarrierSynchronizer pFineFreqCompensator;1 P. `# ?, t5 ?
dspcodegen_FIRDecimator pRxFilter;+ O: w( l T8 d/ i: B8 m; n( Q1 R. H
comm_SymbolSynchronizer pTimingRec;' P" ^, f5 f$ L% x* O/ J
comm_PreambleDetector pPrbDet;% s* h) y7 Z) a) k, [
FrameSynchronizer pFrameSync;
% S7 Z" t; U- d& A; ^* U QPSKDataDecoder pDataDecod;
* D8 v" K7 I) g% X: v static double usable_left_filtfilt[81000];
% |; [! l2 r4 f5 |2 u( _! j static double youXiaoShuJu_QuZhiLiu[81000];# x' y& j* d9 e
double mtmp;% P B& q( T( D) u3 l; N' r
int ix;
$ p+ b8 X. v, o+ k+ F4 a boolean_T exitg2;
+ m0 z) s+ Z) x/ k boolean_T exitg1;7 d* _- I7 l0 l9 P% w
double YiZhenShuJu[800];( e6 J: { t: v+ x% L* r5 v1 [
double dv1[800];
* b1 j0 K+ U' p$ d& Y- Y
# j+ v+ J( ]6 N" b3 `1 X! l4 E9 a* K; ^* C. s/ j# B
double b_YiZhenShuJu[800];; D# g' p6 }) R2 R( _
double I_filtfilt[800];% }8 I3 ~/ M* `
double Q_filtfilt[800];: }9 Y4 B0 c6 E' B' }4 c) Z4 R
creal_T b_I_filtfilt[800]; g- h& Y5 E8 M0 {
creal_T b[800];
3 Z* y( P6 A a T+ E6 w. @- Y# [: Z4 M creal_T RCRxSignal[50];4 m2 v3 ~( k* y1 U0 |
creal_T fineCompSignal[50];
. m) \2 Q+ W' a# E2 E double phError[50];2 K2 B; s0 c6 f- L/ K+ m
creal_T timingRecSignal_data[28];. v: ?1 s7 ?( w: ^3 M1 Q6 b4 G% Q# R
int timingRecSignal_size[1];$ ?( d2 O4 C) B h) X* |: X
double prbIdx_data[28];
8 C; M: U: k' ]& ? int prbIdx_size[1];
; h4 t; f3 E1 H% {- R4 e9 m& ` double dtMt_data[28];
s3 r0 c P1 ~' w Z int dtMt_size[1];
& C( V9 D6 r/ j1 [$ l- y creal_T symFrame[25];
/ k9 K: S- f; d" B boolean_T isFrameValid;
; W( I2 Q Y% r. e$ v double unusedU0[3];
: d! ]. b" N+ i+ S G$ W! U
! L. s5 @' R# R: f; g9 q //调试过程中的变量
+ J) c" g+ L( ^2 o# S! M" P int enough_data;
r8 p0 U1 m0 A/ e- Y$ V5 `: f# D; ]+ g( x' ]' E A. j
int enoughDataFlag;
t' u3 C8 T5 _( m0 O/ |, V4 ?' X* Q int yiDuanShuJu_mean_int;
9 w. _% w% ]3 f, U& j Y7 H6 a8 _ int int_sum_dv0;! p3 Z/ x; B" x- h5 C2 U$ S
int oo;
: G b# S0 z9 Z# b( _2 E int ii;8 R. i3 z# f7 Z: N) I2 K
myfuck=10;6 r2 m' X+ I' r; H
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */5 y1 @# Q4 \" q
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */9 Y% K" `+ V! w! c) p4 D/ ?
2 K% G: r& {3 g$ n5 I8 |6 k7 W
yiDuanShuJu_mean = mean(data1000);3 x# U. @8 v( [/ d
+ D. r3 x* a: @- }9 r1 O" ^2 r yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;6 S3 ^& Z- X- {
UARTPutc('A');+ J" ^8 ]) y: Q: g! D
UARTPutNum(yiDuanShuJu_mean_int);3 y- w2 _, E! \. y$ h, G1 J* ?4 A
UARTPutc('\r');
$ j/ K o9 r; d: f, n UARTPutc('\n');
& y5 s1 j. y* D6 X" q/ g/ m9 P* B: Z/ w1 K4 g V6 c
for (ixstart = 0; ixstart < 1000; ixstart++) {
$ @9 T2 H3 Y, F) g3 f8 c! T yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;. h) Q1 [. W, S3 B0 X
}% `& e* [. ` D
) N- U% u c* U& k% h/ V- l+ p C power(yiDuanShuJu_LowMean, dv0);
: z6 l& D- Z* X. }, L6 j
0 B$ N: Z+ _# T3 ?* L int_sum_dv0 = (int) sum(dv0);2 N+ u/ O; ] o4 Y! k0 m
. b8 K5 R- P9 [, a# U- Z% |" i
UARTPutc('B');
. n: T$ v: P( E% W T UARTPutNum(int_sum_dv0);
5 s# f$ D3 z9 {. W H2 Q UARTPutc('\r');5 l5 Q& E# D" d# \; r o" d4 p
UARTPutc('\n');+ B' s) R" w+ ]' E6 n& p
" `* }4 s' F0 N3 i b7 @. E5 Z& x4 s
// int compareFlag = int_sum_dv0 > 1.0E+8;" }5 t8 ?" \6 ]$ ~* V# b
* A: M9 u4 Q8 c' u! x6 C$ q if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?, S9 S4 `& D: Z! [% \) X7 [( T
UARTPutc('C');1 y! h' E8 c7 A6 i: y0 | N2 Y
/* 比较信号能量 */1 G/ M S5 D. s
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
8 [7 J( ]3 M; u7 e0 P// yiDuanShuJu_mean = 1000.0 * youxiao_k;9 t! t/ L% i" W* C6 \4 Q
// for (ixstart = 0; ixstart < 1000; ixstart++) {4 X' N7 k" w# \0 f! |/ r) B8 A
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =* s _2 v! y4 F7 J2 D
// yiDuanShuJu_LowMean[ixstart];
+ a2 h) ^. A6 I. d// }
6 ~8 j' W) T* K//0 Z( [8 Z0 m( e$ y# {2 J7 d
// youxiao_k++;0 a5 ]7 r$ n9 ]; B* R
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
8 f- f) S% T4 T" G# m2 H// /* 感觉要取21个数,即0-20, */
& F- _. M4 N4 a! \% G4 \// enough_data = 10;//有效是10,无效是0% V1 }! ~# a9 m! D, v
// }; f; E8 ^( V; a- o1 j1 W4 P% ]( Y$ K: l
}+ y" \; \0 n3 O5 J; o9 F
/ y3 t, d9 p# U+ |/ i# W' C! _
, c% u6 G3 }, B( u \ enoughDataFlag = 100;$ E5 N7 ~/ ?. A/ |8 @& \& L
enoughDataFlag = 1000;
. d+ G! Q; q. k6 q8 D4 q: N5 ] enoughDataFlag = 0x02;
0 C2 i) Q' y g6 {0 @$ {0 i enoughDataFlag = 200;
4 Q w+ Z# m- J0 k5 |/ v0 ]' \! T( y1 |# ]% N
int myfuvk1;
- Z* Y+ a8 t: i# U8 C myfuvk1 =11;
# } H' n' N: m, h5 i- Z! u* i) b: o8 Y2 H) Y3 R9 G5 T6 Y
+ Q4 o3 t1 d! ?) L% K x
enough_data = 0;7 T5 P0 `" L$ _% i6 N1 {
& F5 c, X5 R5 g4 S. @ }// if(enough_data>50){1 w5 A4 e" m. S: d
// enoughDataFlag=0x01;
1 Y5 V- a" Q i- Q7 \// }else if(enough_data<50){& W3 A* W" m: R2 S, A# J
// enoughDataFlag=0x00;//0x00还是不行0 {2 l% q. l/ a/ g5 r' h
// }$ n2 `, F" O5 V+ ] ]; Y9 x$ a" w
8 k* I$ E6 _; E, E! L
5 [/ h+ k. {5 E% a' s oo=10;2 d2 @7 R9 j/ _+ i1 k
oo = oo < 5;$ d0 [) m$ S' K
if(oo){9 ^1 j" u. u% s6 `
ii=0;8 I8 K' O0 o7 k. L$ I2 N
}' y; x9 H1 D8 V, h k
if(oo < 5){
* H/ {0 M N2 `; u S. h( X- l ii=0;
0 z! `2 k7 F& v' [. } }
|5 y3 V# ~# r% x J if(oo > 5){
; O3 {' J" d$ P5 F ii=0;1 x" ~/ Y$ y T8 D( @8 P B
}
# L7 ^8 j8 y9 q" X+ R, q0 ~* ]; t0 M; v) @; ^/ ~. |
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */ O1 \4 C/ Q" ^0 t3 W
/* 如果数据足够才执行主程序 */( O) u' N8 v+ c; z8 b8 x
oo = oo < 5;
: _/ [, V- w0 L' F) L( } enoughDataFlag = enoughDataFlag < 5;, c1 M- J& `% I# q4 y/ j
if (enoughDataFlag < 5) {8 A5 I1 ?3 T( I1 n$ [, _$ i
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是02 y' D% b& Q, Z5 b
AGC_AGC(&pAGC);
1 n: _8 k& _, k) z K* g n# ?; H
5 X$ V% o3 b, g+ p! Q, E2 w( Q c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);/ U4 n: A$ O2 W6 O
FIRDecimator_FIRDecimator(&pRxFilter);
7 n$ W. Q2 A, B5 a. ]$ n& o) V. m7 T
/* Downsampling */! q! b# P% H# `/ d( I
c_SymbolSynchronizer_SymbolSync(&pTimingRec);
1 R7 B: ]6 P' J K5 `$ a8 M% e) O k3 A# W/ I8 L1 j* d( Z
c_PreambleDetector_PreambleDete(&pPrbDet);
4 h! n) I8 A: h+ N) h; M
D. ?+ p" W" V5 ~+ _ /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */ Z/ V' T u. h" D, S- I
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
" K6 A9 e3 K- s3 W; _ K7 A /* %帧数量=100 */5 n5 x' O6 R- Z0 O' u+ ?1 T
pFrameSync.isInitialized = 0;
& w% `: }' b6 O, R% o* y2 |# F5 ` |: ?
/* [EOF] */7 B2 }1 s! v' Z }0 A2 D; _
/* 前导码长度是13 */7 j* l% x1 t, ^% p8 p6 k3 c% i' t( n
/* %qpsk */; s' ~, g$ x7 p+ r" {. \3 c( M
pDataDecod.isInitialized = 0;7 p0 D' }0 W# l3 y% T* |/ ^
0 U+ \( }" f; n/ y1 s: y/ Y7 C* a" v2 O /* end */$ ?1 \4 V% Q& o$ C# @- @; ~ ~
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */, o5 l* v( x2 w1 L( n9 ?- b$ i
/* Convert 3-dB frequency */
8 {8 Z. }- P6 E; b A! u /* Convert 3-dB frequency */, |+ o: @) F" y! w# ^
filtfilt(save_buffer, usable_left_filtfilt);& f2 d/ {/ t0 i2 A& s- T
for (ixstart = 0; ixstart < 81000; ixstart++) {' c9 a4 J7 c& o. P1 w
usable_left_filtfilt[ixstart] *= 2.0;
: u# ^; J) M* O6 K4 d }1 a% m+ T* z3 H# U. A
) G! X+ q0 v( V) F( u
/* 注意乘2,处理幅度 */( m g) `6 h$ [$ P
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */
+ I$ _$ Z: D' l+ [$ ^ t4 O /* %% 行列转换 */
$ t6 Z# V8 L" m: r5 Y yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
7 t/ P, y/ e# @/ @/ G0 W5 d+ y for (ixstart = 0; ixstart < 81000; ixstart++) {9 P0 ^, C" w0 D% _$ X* h1 _. z
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]& X, R* f$ M' H4 y$ W5 B$ h
- yiDuanShuJu_mean;& H% e# L$ `' C4 N$ r3 Y
}
% H6 l# D, b0 R* J( M
, N: b' Q: g# c/ w, s8 S /* %% 应该对数据归一化,但是这一步放在哪比较好 */1 G6 ?) _- |; f$ Y
ixstart = 1;
. x& o0 Y+ r8 a# m8 |# u mtmp = youXiaoShuJu_QuZhiLiu[0];
# H: \2 R& `4 ~; n) P" b$ ^( x: } if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
$ L! D6 T/ q& A" o# z% S+ a ix = 2;" C) c1 w4 t" d) h1 n" q
exitg2 = false;
/ ~, @5 a$ A: @( R while ((!exitg2) && (ix < 81001)) {
2 M- R* G$ y3 N& T) U5 X) Q( ? ixstart = ix;
$ |4 ~& G ?% W$ c4 q' @ if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
1 y7 m/ Y) N% j7 ? mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
8 |7 d& x2 O0 [ N% b) w, T exitg2 = true;
5 P! i6 ]' o0 X0 E } else {
0 H6 G' R. V( x% B! m3 w3 G$ i ix++;4 B" _* c! \2 G- o" C9 o5 L
}" N& ^! y1 F. B h+ b1 ]' `$ s( d
}3 B! V! f+ y4 b5 a+ w8 F
}3 c: H9 o& y1 m. C
8 ?9 F- Z) }: W3 h if (ixstart < 81000) {" P2 D' p0 k2 M O" g
while (ixstart + 1 < 81001) {
4 ]' ^ ?- m6 ^3 z if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {$ C) }8 {; w( A, f1 M& g3 S9 A. e
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
- C; l& Y( H( k. u1 M: ]' @% d }. a" _' ^( j) U; o( B: Z8 n
* H' }0 V: H& H$ v1 {/ o8 V
ixstart++;
& o8 m `8 P( Y' C# q* M }
8 Q6 c- \' }0 a& i3 _ }6 C5 p" V, @( ]8 M& U
4 O4 b _( i: [5 c' j2 P
ixstart = 1;
" U5 v# n0 K5 k# ? yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];: N+ J* E$ s# c6 O
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
2 j7 o$ e. O3 D8 N5 ?8 f ix = 2;- P. E" r. d# ~9 j1 F
exitg1 = false;
" W. n/ R0 K8 j" e' H' U# D while ((!exitg1) && (ix < 81001)) {; o6 j3 k; y7 J( D, ]7 v) s9 `
ixstart = ix;
! ], O% Q" h F8 y5 {8 s if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
& h$ r# x: u' i {' B yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
9 I% P$ P8 T' ^ exitg1 = true;! t: d# w: H6 N8 s! D0 h& Y, s# p
} else {
" A- z8 ~" M2 i4 v4 l. M7 h ix++;
! \( i! ]- x8 N! s4 F8 J7 n; H }
- j5 V; ?# o9 U! ` }" O" u1 |! p! [' o
}4 d) |# J. Y. W' f% J
1 l' h" ~& A1 q1 X$ ~1 v if (ixstart < 81000) {. B% }) w% f2 H( h
while (ixstart + 1 < 81001) {
. H# u* v* Z! {- S' r, K if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
. M- D' x1 G+ `7 K' ~( ` yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
; I3 U! \" r* q& T }
n) U1 d+ r6 ]. N0 |3 _
5 r9 \/ D# [! h9 \! @0 o- S ixstart++;! q# U3 d: e* q5 f) j
}
* ^6 k L3 a# N! s }
" T- C0 m% y1 c! W9 M- q# R, u6 ?; e" o) ^% p' t
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);' T" @% }) q2 M7 L, y7 v9 Y: ~
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
- G6 \3 v7 _1 k: u+ a yiDuanShuJu_mean = mtmp;
! a9 f$ X" A! N6 C }! i2 q, W; ?1 {% r3 ]
( Z x( j7 z3 |. T( _! _" z$ a! o /* 找出极值 */& ~- J: x: s7 F
for (ixstart = 0; ixstart < 81000; ixstart++) {$ r* F/ x9 E) S9 P+ F+ e6 e
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
; Z+ w% U5 a( T& s }
' I" h9 T+ r3 m0 R5 {& J% m) V$ g7 t* i! E8 A' u+ W! ?) o
--------------帖子字数限制------------------ N$ z q; h8 ~6 _6 X' s' E" O
}
$ n2 H$ l4 r+ |) W' l( l4 ]4 {( x; T$ R+ C4 r
- ], l" R5 J8 F) t# r |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|