|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 2 Y$ z! U9 A9 M' I" c
- {' S6 G2 q9 q7 ]+ h. a
各位大神:/ d2 c6 ~0 N' J! L, p# e a; d
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~) U: h* }& m$ `5 Y$ [ k
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:. r2 [3 J' r$ k
) x! i& a5 h% P
; f. q" ~' ?! @3 l4 r
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
, L* q6 w0 x; R# x8 H1 q: `0 P3 Y* l# r' H* S! p, c# K$ x4 e
并没有其他线程
) X$ p) A& m, g3 u5 O反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
$ P& t. B+ \. v ?也说不定是和堆栈有关系。。。。。。% f" V; g. S* [5 H
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....- Z% m5 ]& k. ^; c9 J; L& Q8 u
8 J" z; h' m* B7 Q1 B
7 G; i* o5 K: X; X: ]# k
) N# H. i0 r( R我也很绝望啊,希望大神能帮帮忙,感激不尽,!
- W1 T- Y, G5 L* Z0 b: Q
% o* y& b' I" r) @: _4 v
) I; P8 d/ N! t6 h. O: O( U) K! }: W附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
0 F F- L0 u' U A# s9 ~6 ~ O* M0 { static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
2 l) I. o. r" @7 @7 k; o6 u+ m6 B, q4 Z! H5 T9 H
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
. |% C7 \7 d' X4 m; I6 N const double data1000[1000]) {' [( X; {$ d1 l* f6 N: h
$ C' U% J. u, _3 v; s5 d
int myfuck;
: n# X& T# t0 e* D double yiDuanShuJu_mean;
" i4 y! e- o! |7 u! N/ z6 h double yiDuanShuJu_LowMean[1000];# ]" V) S, O5 d- t
int ixstart;* y8 u3 J$ ^/ [0 q# R. T$ L
double dv0[1000];
. [, Q: |9 G5 u1 O4 [ comm_AGC pAGC;
+ m1 _( ]% ^: F$ d7 n7 h comm_CarrierSynchronizer pFineFreqCompensator;$ o& I1 R7 O5 @% T( h
dspcodegen_FIRDecimator pRxFilter;
3 k! B) t: ~# H- n comm_SymbolSynchronizer pTimingRec;* N5 o* Y6 ^' ?: c
comm_PreambleDetector pPrbDet;
5 [% v' H. t. j' Q; b& Y FrameSynchronizer pFrameSync;
# c K; w9 n% R QPSKDataDecoder pDataDecod;
. @. r% w( g# h9 e3 F3 ]( X static double usable_left_filtfilt[81000];$ f8 ]9 ^. J0 O/ }4 u! V
static double youXiaoShuJu_QuZhiLiu[81000];
. T5 Q. {; W( J% c; r double mtmp;5 c6 Y- \$ @2 G. ^
int ix;
9 x" q Z. W9 ^+ O+ b1 ]2 V boolean_T exitg2;
- H F. {8 {6 Y+ k; J boolean_T exitg1;
( D) k1 X7 q% F! ^3 P double YiZhenShuJu[800];; c- u9 d3 L f ]( n3 A
double dv1[800];, W+ O+ a* z6 v! z: z% J
8 r% R! _2 x4 X: ^! b. M
/ D9 v/ I, h D7 a Z8 B
double b_YiZhenShuJu[800];) D! X0 M* l/ P
double I_filtfilt[800];
! N& v8 x \6 | double Q_filtfilt[800];7 F( L( J" l- I. u, F( B
creal_T b_I_filtfilt[800];
4 {( G; ?( k( j# K$ x- @; p- Q creal_T b[800];
3 m1 ^2 }9 ^5 S$ L8 o" x, q creal_T RCRxSignal[50];
* o0 w* b2 X8 n" b4 K4 F$ D% _ creal_T fineCompSignal[50];
- l1 N5 U1 K( E- [) |) r0 y double phError[50];% ^: X# m: W2 k+ b
creal_T timingRecSignal_data[28];# c8 L( O/ x( b
int timingRecSignal_size[1];3 v+ n) v: d. f- J9 g; T5 j$ |
double prbIdx_data[28];
3 Y3 M. r, D5 \# v& } int prbIdx_size[1];
3 ~0 o/ ^ a: g; n9 r, C1 B+ X double dtMt_data[28];* C. h/ P N& ?
int dtMt_size[1];/ x9 E; [, ?- S
creal_T symFrame[25];# ]( R# {2 {2 n- b7 [5 n
boolean_T isFrameValid;4 |: j/ o- Z K0 x0 b
double unusedU0[3];! z& ]; R& D7 D' L: W
& |1 f& V7 ?# o //调试过程中的变量7 q$ V1 d) _( q" l/ Y$ P; J7 [
int enough_data;# d* F5 t+ e- L
4 G0 C7 t& ]7 L+ d" O6 \
int enoughDataFlag;. J. Q c: u4 B }( x. g. w
int yiDuanShuJu_mean_int;, ]4 {4 e& g' K" P- j0 G |
int int_sum_dv0;" i4 `9 b9 O! b Z
int oo;
' Q- ?1 R! i( f; i0 k1 q int ii;
0 h9 d( o1 M2 l myfuck=10;- u1 _ G( r# H: [* ]
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */* h1 u8 d& x4 B( h- w) E$ Z
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */1 X* J" W, p, }" A' z8 K
: H( t% S. X0 D( D# |
yiDuanShuJu_mean = mean(data1000);" w; {- \' I& e* X
* s: q4 `9 N- u* M0 s7 O yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
3 c) v/ Z e3 ^) Y9 }1 W UARTPutc('A');
q" d' T, Y! a4 X1 b- K UARTPutNum(yiDuanShuJu_mean_int);) N5 r3 _' g+ J, ^6 p! c6 x' x
UARTPutc('\r');
) L- g |; J/ x UARTPutc('\n');
" s" T( w% X: I% C5 K8 H4 M, ^- k, B, s
for (ixstart = 0; ixstart < 1000; ixstart++) {# ^$ ], R4 z6 h1 P9 O' c
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
9 U- q6 b$ A& K$ f6 @8 O1 ~ }& I5 z$ w9 s2 k2 i, F
- b7 a5 N; O) I" J
power(yiDuanShuJu_LowMean, dv0);2 e7 G* _. C* v. q* A
4 a4 P) E- p/ f$ n$ Y% d6 K( p1 b
int_sum_dv0 = (int) sum(dv0);9 N! E5 C+ g/ j" m- U
6 B1 d }! h* E0 }! c UARTPutc('B');
8 Z; }) v7 o( |: i* n* { UARTPutNum(int_sum_dv0);
B: K, `4 t! _/ z& c2 s9 M2 g UARTPutc('\r');
" b, E" y5 T. w2 M! [ UARTPutc('\n');
* z8 L( J" R! I* ^9 H6 w; s/ N0 S. f. ?! n5 E8 q$ G) T$ o, X
// int compareFlag = int_sum_dv0 > 1.0E+8;
# k" J) t; d( r4 N9 o3 U
! \. V6 Z) w3 g5 ~! ^ if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
! W. x6 I. d# K# A0 h) A [; ~ UARTPutc('C');% a. K* ~; Y* \0 \. V" i$ [3 N: |
/* 比较信号能量 */
! g* n4 t" l5 i /* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
8 R* A3 D4 n) k' A! W// yiDuanShuJu_mean = 1000.0 * youxiao_k;
6 g9 A" f. X0 ^. G9 K// for (ixstart = 0; ixstart < 1000; ixstart++) {, z G3 {+ w8 C) i& [
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =' C" ~1 m0 P% G* R& i
// yiDuanShuJu_LowMean[ixstart]; }: r2 ~" ?; R+ p+ X
// }3 m. I6 _0 {/ M
//
! |0 _& b2 f2 V& U4 x0 K3 x// youxiao_k++;
3 v' I" Y2 N! L ?( ?# {' q, F// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
& X; r7 E1 @% I5 e5 B// /* 感觉要取21个数,即0-20, */
0 u8 N. J) U7 q" V( ?: C- Q// enough_data = 10;//有效是10,无效是0
3 Z2 e! e1 w$ J// }% d" z% W/ d- m) i' F; C
}
& U9 k: F* e0 n6 [! k& V; z: ~. N% y- k; K+ [
7 F% ?9 ]2 o! u* @- g
enoughDataFlag = 100;" G2 S3 Z/ i+ W9 |9 s: Y
enoughDataFlag = 1000;! p6 R2 P: a& t+ E7 M
enoughDataFlag = 0x02;
. }6 M- f3 G$ i8 ^' p m enoughDataFlag = 200;
/ | i. O; ^6 H2 c) B* K& G
; Q/ \6 D7 `, ?2 [7 Y& c int myfuvk1;
# S! F$ `$ f. b/ T, k1 E myfuvk1 =11;7 S: p1 r7 z4 w# v
! Y8 |: _3 e3 L) X& j" q+ b8 m/ N
: \7 l1 l4 m* s0 d enough_data = 0;6 u0 O) A _# H. Z, j1 g$ x8 c# m
0 \: O) b3 p* ^
// if(enough_data>50){
7 Y' x+ L' k4 s, ?// enoughDataFlag=0x01;" [0 z2 _8 ?2 f2 s
// }else if(enough_data<50){. m6 Q' x9 ?" b" z& }
// enoughDataFlag=0x00;//0x00还是不行
0 l2 v5 O% H* @2 z. G// }
- z0 X$ X) t! S3 F! T Z) p; m; }
: V2 @ V0 p6 E6 [( C
oo=10;
! f4 R7 _: R7 i+ d oo = oo < 5;, r4 M" ?% [& O/ D! c+ x
if(oo){# V) q9 {, J8 f+ B: k \
ii=0;
9 c% [+ E7 u+ ~( P: D2 W }! Z2 Z2 u0 P* v
if(oo < 5){/ U4 {# Z1 ^# n, d
ii=0;
; J, F5 T2 g4 Z9 X( s8 x) T0 l# E }
+ `: ]) R- `3 z: N6 b if(oo > 5){
+ l2 l" g" W- g, W0 I ii=0;
5 n9 b f1 e6 T0 u4 F+ R }/ y) {. G8 W* n$ H9 Y) }
o& w3 J1 K5 G /* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */- T# p7 T# Y2 | Q" }
/* 如果数据足够才执行主程序 */
M& n$ c2 \$ _; d0 O" [' I3 M+ W) h oo = oo < 5;7 d6 O$ @/ i2 \$ O. X
enoughDataFlag = enoughDataFlag < 5;
) L- C$ S( f6 O1 s8 Z5 ` if (enoughDataFlag < 5) {1 o; @! Q4 l1 q* S
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0# C3 K7 L9 c' L) h% i$ I0 W% h* T0 ~
AGC_AGC(&pAGC);
0 O& E, J1 d, U- K; @
! e% U5 ^' ?% D5 g7 j c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);7 Y# C3 s. \- `
FIRDecimator_FIRDecimator(&pRxFilter);) ^0 X/ C4 t2 D" E: G7 v O
9 t# K6 ]. g5 ?: t7 v2 ]! t" _
/* Downsampling */ V- }4 w f0 w+ ~$ c8 b4 Z
c_SymbolSynchronizer_SymbolSync(&pTimingRec);
% Y3 A: X0 P" U2 v% d' L
. p: X9 e2 z5 u% h) S0 u! k2 s$ L c_PreambleDetector_PreambleDete(&pPrbDet);7 b1 M7 e0 Z- r2 z4 c6 G/ W
( i! S/ l2 z5 K, N5 r /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */) y) [7 j2 s7 o
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
% }* h& o/ d1 E7 l) S' a* m( p' b# K( G W /* %帧数量=100 */4 \( l1 U$ T1 M& r/ \
pFrameSync.isInitialized = 0; \) L1 E& }3 c: u( k# D3 }
$ E' H6 ]: l: A/ W /* [EOF] */6 }5 z3 b; O- X' N9 Y
/* 前导码长度是13 */, ^. o; t* A& R0 w3 {! q p
/* %qpsk */' t% J6 Q" ?. I
pDataDecod.isInitialized = 0;
0 ?1 [8 D/ Y+ X- e3 S, o
$ h4 U2 P8 n4 T5 B' R6 J- e /* end */
5 ]! E: A- C$ D /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
8 k' o! j5 s6 n+ o5 }( N /* Convert 3-dB frequency */8 y' T* {, K4 B1 L* C P3 k
/* Convert 3-dB frequency */% X3 s8 |- t+ H
filtfilt(save_buffer, usable_left_filtfilt);% b) t" Y7 c' _$ }
for (ixstart = 0; ixstart < 81000; ixstart++) {
7 N6 C7 d7 B, ^$ K- j usable_left_filtfilt[ixstart] *= 2.0;$ M5 p: L5 h: g9 g, K! L
}
* S$ n1 r; N# R% z N0 F( h7 e8 H* b5 l, \4 G! X
/* 注意乘2,处理幅度 */9 ]& N, Q1 v* Y- c" j: g( ^
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */2 C) M3 j9 c" i3 M. i+ P. B
/* %% 行列转换 */+ [0 L: u/ ^' `( G
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
% U3 J: x0 S. ^0 q$ |6 v; @) K for (ixstart = 0; ixstart < 81000; ixstart++) {9 Y7 B7 L, Y" [' M5 |
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
. ^( t9 e' {5 j6 c, V' d S% D - yiDuanShuJu_mean;& {- N% a- K8 I% X5 e
}
5 B# `* T$ B# |4 n2 W9 }) s* B- g0 L4 N+ m* N4 U
/* %% 应该对数据归一化,但是这一步放在哪比较好 */2 T8 z9 z8 d8 d- }) m
ixstart = 1;1 G) @$ h9 S z4 ]
mtmp = youXiaoShuJu_QuZhiLiu[0];
/ v' Q. D* O7 i" h! F8 R8 U" @ if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
8 R3 Z' k, i5 g, s1 c% P* [% S ix = 2;4 I% ^: ] o( v8 j( }5 t0 l
exitg2 = false;
% V& v& g( E5 \' ]2 _, y& x2 u while ((!exitg2) && (ix < 81001)) {
* G- T1 j, D3 k x/ l# }! o1 R* \% ^ ixstart = ix;
6 ~8 u& g. r: T8 q. C4 o, U if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {1 W" o' G+ _8 m+ y0 m
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];0 E+ a! L9 ?; I: U6 k# X m
exitg2 = true;! v0 v5 D u$ B
} else {
3 n" c! G/ k- I$ b4 b* v ix++;+ h( U& K/ e# s
}
* o8 l v* Z O! x }. u0 H! J6 V9 g0 Z' z2 F
}6 {) j2 Q: ~# Y7 y& Y5 d& u
3 o- h! {( W2 C/ ]$ m! U. W. W, A if (ixstart < 81000) {3 |0 B$ L3 A* O# R3 s! X: X
while (ixstart + 1 < 81001) {
& t- d2 D0 ?1 `. Q' y: s if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
d+ C% l" P2 r, D: H+ y mtmp = youXiaoShuJu_QuZhiLiu[ixstart];/ x7 E2 j# O- H
} d) n' a5 [0 ?6 @0 P: g0 z
: x$ z, ]2 Z; S6 A9 U9 n ixstart++;
3 _5 j; u+ Q1 R) {. J m: |0 _ }" A; y2 b5 G/ }2 g4 t/ A* B
}1 M) P, ]! {$ i: W, Z F& G
5 J- S. ~1 W. ^( _
ixstart = 1;
4 o& I# N& e1 m! @ yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
- u8 A9 s" ?4 r5 w if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {2 \6 p2 D# U/ C- G8 ^
ix = 2;* I$ q2 Y, n. z
exitg1 = false;
' ]0 l; J2 s% F' o: T. O* A3 n while ((!exitg1) && (ix < 81001)) {5 ?+ ^0 o* k( b2 \; @' T
ixstart = ix;
/ g$ D! n# [# }6 I* j$ V if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
0 X4 X1 z9 h- Y' v yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
$ ~9 s& Y# y" I* v exitg1 = true;/ r; L" n9 M8 F/ K
} else {
h# d" x9 _ I9 p8 d. E: I ix++;
$ B1 j$ i3 A, V$ ]4 y }, t& V" c. @4 |
}
F- ]$ b9 \+ K& i2 j+ i; n- V+ j }
, z" l7 \( {7 ?- m$ n
# l# C% h# N# n% T# Y if (ixstart < 81000) {& D6 T0 r( r0 e9 J7 F: y9 O$ i; \
while (ixstart + 1 < 81001) {1 A. b# f' K- [+ D) b/ Y
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
8 x2 j) T# q$ r% \! _- v: { yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
( B) C4 N3 | C" c }+ O& \! n$ c% V2 p7 V. W" W0 C
' a8 Y" U0 j- c! m7 c' g' R. } ixstart++;
) b8 Q u0 w, [ }
/ j! E, v. L- e) A }0 s2 i# ~0 e" _1 c! g- O" }
1 O$ t/ N* O# G( q
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);& V+ Y" I l( I5 i2 R8 L& s7 G5 L4 q
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {6 O- G& f* |3 S0 n4 p
yiDuanShuJu_mean = mtmp;8 ?) c9 Z+ Y1 t( M
}
9 {4 t' j* D$ h& i# ^# ]
2 `& a! {' {$ w( L! P6 q( U( J, D# s /* 找出极值 */ u( w; a5 f7 l/ |- T
for (ixstart = 0; ixstart < 81000; ixstart++) {# W& @+ f- H4 ^ X4 B4 U. t( C
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
; W5 A% Z' \: a/ D }
i5 B5 H0 D5 V) i: D. a5 u `- q$ {
--------------帖子字数限制------------------
+ n8 C9 V/ [+ Z7 A, M2 T}! \$ ]; z: p7 f( C* P
; W! b! E j8 R! D( H" l5 H5 ` R/ L; u& w" I. x% Y
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|