|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
9 y8 j3 o6 p" `: {: N1 |& A5 t9 f( \& p
8 D: V5 J. d/ ] r- R z0 M" M各位大神:6 ^0 R" k& Q8 y6 a4 i1 E
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)1 b4 \& n8 A: v3 G* z
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:0 Z0 r" D2 T+ N0 C2 _- a
" A: R! `$ T& F 5 Z g$ l" K! s2 t
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。7 h& Q+ L' _$ y+ [% m0 G
' y9 t+ j0 Y! }% @. y5 U' ~
并没有其他线程4 b* l. f& f+ B% C7 E
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
) K# C% L: R, F& @也说不定是和堆栈有关系。。。。。。
, i& T" s& t% P6 V+ N6 W( S0 b& e请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....) A; P* p) G& {- l. Y* K
$ b2 Q8 }4 _2 {1 C( d1 i2 S4 E
1 ~" `7 w1 z, v
) V$ F7 e5 U+ q1 T: I我也很绝望啊,希望大神能帮帮忙,感激不尽,!
( K. W8 o; C, Z0 O
O3 w' E+ l/ b" u8 y8 J; v7 R9 A4 f, r2 s4 n7 o3 Q. K
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];$ {! ]; t. g0 K3 U; s6 @
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
. f5 Q7 Y5 S5 B" e/ Q/ a" ?- U# K9 q) O+ O( O
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(1 y( | o9 v% O# F6 t
const double data1000[1000]) {/ k5 x( a+ E( J; i2 u
! F4 B1 p1 a5 i/ H$ I
int myfuck;9 E+ w" V" `6 X7 Y( D
double yiDuanShuJu_mean;
6 {$ ]( g8 r1 \/ P2 B& S double yiDuanShuJu_LowMean[1000];
. M% j, a/ D6 K! A6 A, S; _# V5 f5 ] int ixstart;+ ^, |0 v0 P) q1 Z% N- o
double dv0[1000];( y' w' a' e' F" R0 P* w: W8 m
comm_AGC pAGC;9 }$ s6 F, C% b) k
comm_CarrierSynchronizer pFineFreqCompensator;' a1 _/ w% u0 B* s A
dspcodegen_FIRDecimator pRxFilter;
; w8 M r/ l( i0 L comm_SymbolSynchronizer pTimingRec;- t$ E/ y: V5 ?. Z$ ~ `
comm_PreambleDetector pPrbDet;# H. M6 S* Q( j5 Q6 u
FrameSynchronizer pFrameSync;
( Z- y# g5 ^3 C# G QPSKDataDecoder pDataDecod;4 a0 J% h9 {# H7 I2 o9 k
static double usable_left_filtfilt[81000];8 M* o# M0 T, m6 e4 b/ X
static double youXiaoShuJu_QuZhiLiu[81000];9 ^# f5 f, A* V
double mtmp;
( o' g/ A4 N( y- i) y int ix;4 p2 X; s6 a* u% Z. Q) h9 \; M
boolean_T exitg2;) H* |5 \' ? _* L6 b6 z
boolean_T exitg1;1 y4 V) V: Z8 x! p
double YiZhenShuJu[800]; s: F' l, r2 \$ y& u+ {
double dv1[800];
6 N7 L' k! U$ Y; W5 C8 t3 t
" ~3 x* ^0 g* T! O3 Z& A$ ~0 {5 [4 I! ?+ K. a8 @7 M* N( s, x$ d+ E
double b_YiZhenShuJu[800];
& F/ ?" V$ @7 g0 @$ Z! H1 c" _$ E double I_filtfilt[800];0 e1 o( N1 K* I4 h3 ?
double Q_filtfilt[800];
2 {# S9 s! v3 J6 u5 n creal_T b_I_filtfilt[800];
8 m l) J7 ~7 m$ K2 ?# P3 A* S creal_T b[800];
4 R' j- P X( N7 m( W ~% d6 I+ B% j creal_T RCRxSignal[50];# I% j( V8 [( l) p* U7 y8 a9 w
creal_T fineCompSignal[50];
- Z" M$ T7 T1 G6 W9 x/ w double phError[50];. R$ I& x! [+ k7 F! B$ `! q8 j& l
creal_T timingRecSignal_data[28];1 }, ~* [9 d% P5 O. N- F
int timingRecSignal_size[1];
. q3 K/ g5 T' T' T) o double prbIdx_data[28];4 U. ]- i$ K1 _; K6 L
int prbIdx_size[1];0 H- _9 ?: d3 O( p1 Q% j( G! k
double dtMt_data[28];
. Y9 ?- P9 x) D+ _ int dtMt_size[1];
+ O& Y! T- L$ V. \; `+ l7 o# c creal_T symFrame[25];
/ f* m) a6 ]( K; ~; _0 t boolean_T isFrameValid;
5 i( k* Y( e5 M s4 ~& F' x: Y/ U double unusedU0[3];; k! c7 V3 {: s x' m) F5 H) b1 o
, u7 U9 `1 ~# v3 g$ ~9 z" P
//调试过程中的变量
x* x& _% ^# g int enough_data;8 I7 ]) _4 a# Z. e p0 y9 z, B
# T6 z+ w' ~- r: s5 K
int enoughDataFlag;2 f6 X. c% z7 Y: A% G
int yiDuanShuJu_mean_int;- a; D" M' |& c8 N
int int_sum_dv0;
! H7 r9 G' B9 z. x int oo;/ ^# A! y' m0 W3 f& i
int ii;
" N6 x+ o; C8 e8 R2 K myfuck=10;7 p; D' s7 e: D9 S8 s& f( I0 }
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
% M0 j/ t9 T& o5 c/ h& A /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
+ }: a0 U% J9 w, c1 A- }7 C) M4 K9 O/ ?: [5 j+ K
yiDuanShuJu_mean = mean(data1000);
& z9 z* O) I' G. ~ N$ R' z6 t D) r! {' |9 D! c E( e t: b, B j
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;9 k% i: y0 W" N' I% t# H" s) Y
UARTPutc('A');1 R3 G% E _* z
UARTPutNum(yiDuanShuJu_mean_int);$ \( h+ e+ g8 F, Y: g
UARTPutc('\r'); `* U6 L `7 F r: P
UARTPutc('\n');
2 {4 y% y k" }" G P: t: ?. v0 h4 X h
for (ixstart = 0; ixstart < 1000; ixstart++) {/ ^% x3 ]: c2 H) X t& r. ?" T
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;3 V x1 p+ U' Z' v* T
}
- k6 V" ^5 O, m2 y9 p% x( y/ L5 I6 [8 E2 q/ J$ R3 V
power(yiDuanShuJu_LowMean, dv0);( n) W3 y' T, |' }1 S4 b" q
3 x; S/ _( O9 F7 x7 n
int_sum_dv0 = (int) sum(dv0);" @$ I+ W* W2 B
3 n& @6 o. L( {% D
UARTPutc('B');1 R) y/ x# w6 f W$ D! I
UARTPutNum(int_sum_dv0);
7 f; T. M; t! x3 R: H& m/ s6 f1 X UARTPutc('\r');6 o. A8 a3 ~* X3 ?( D& p* s
UARTPutc('\n');
+ U5 `/ ?2 m2 ^1 }1 \' e: y7 \5 q+ l$ [3 u) N
// int compareFlag = int_sum_dv0 > 1.0E+8;
3 b3 |5 Z7 g4 V" s) C$ F1 Q
) U7 L# [2 o% t if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?2 o0 p/ Q) L c4 {2 @$ R
UARTPutc('C');
* U3 g% |5 b3 `6 Q /* 比较信号能量 *// J. A, w. U, e! d: U+ H, p
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
3 M& j! ?( o9 ~0 Y- W// yiDuanShuJu_mean = 1000.0 * youxiao_k;- Z7 |- N3 K- \1 j
// for (ixstart = 0; ixstart < 1000; ixstart++) {" F! P9 \& ~ m7 s, V
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =# c" g# L; S! _- q
// yiDuanShuJu_LowMean[ixstart];1 M$ s2 I* x7 d5 J6 _9 v
// }6 f/ [7 d1 \- T0 X4 n
//5 A4 d- k" H; ^6 `
// youxiao_k++;
; |- p. P3 t2 y" h& J// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
7 d1 |: @$ Q! }0 G// /* 感觉要取21个数,即0-20, */& e' B# ^$ E/ g6 m
// enough_data = 10;//有效是10,无效是0
! `" C1 ]8 C* B5 u" Y- F- p9 {// }
6 o C5 T+ q3 B( `: T/ r. y }
2 j6 a/ b8 Z# J" s4 p7 M. U# h7 b: y3 f( Y8 G, D
* x" c# |: p- B: p
enoughDataFlag = 100;
8 P- N5 h- @0 u* L, O* z0 { enoughDataFlag = 1000;
: ?; V/ E% A' [! a enoughDataFlag = 0x02;& s; [* q. c4 E) E3 [
enoughDataFlag = 200;+ l' B. d( r1 z! V
- P5 y. L( x4 k l* M" U, w
int myfuvk1;
& L' D4 l# ]' V# j( S: i myfuvk1 =11;
( ?" k. S @+ ^6 A, Y
! f% I! b- T3 K9 G: c9 k, d( ?* [$ W4 ?+ o6 |6 Q# W3 I
enough_data = 0;# ~1 X" O" c Q4 v# e
# z% E0 Q. s! i9 y4 m8 |
// if(enough_data>50){
4 `# n" p; w& m3 c2 a$ p# M' b// enoughDataFlag=0x01;) w) s2 _' L+ F& Z) Y$ k
// }else if(enough_data<50){$ m; _+ m5 Z6 r. k+ _, i
// enoughDataFlag=0x00;//0x00还是不行
- Z: {( T2 Q& c// }
" k; R: F4 d+ \
2 j- x- b. R6 \* s- p) e
% F( Y) a/ P$ n3 a, b5 r7 w oo=10;
" g0 K! t. L1 M3 S5 U# X! U oo = oo < 5;
3 V& V7 C3 N# Y if(oo){
2 f- V. @/ d4 W. c ii=0;
$ B# |: ~. w4 k; [0 } }
$ W% R# ], w A" {& | if(oo < 5){
, v, _* f% q7 E# S4 y ii=0;' z% ] y c4 w" J1 M7 B
}
% B) W4 \& y- N) r2 x5 \/ \ if(oo > 5){
5 H& I* q. D0 w1 k) s ii=0;4 T, D: d, ~ [
}* D" } j1 L1 {% z( o) C
4 N& f- F& Z& O; w$ Z3 F% B /* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */3 ~5 Z- h) @( m8 m
/* 如果数据足够才执行主程序 */
! U. K J ^* K: x" S" W% R oo = oo < 5;- h* t% |5 |+ i+ Z! E
enoughDataFlag = enoughDataFlag < 5;5 k4 d$ l- U1 o: @$ T2 e
if (enoughDataFlag < 5) {6 r/ k! w7 I0 S' i* z
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
/ \, O- E6 M. A0 e) Z AGC_AGC(&pAGC);6 s T( q# D0 w6 j' i1 q3 z, F
- ]1 H; r' A6 E, N. e h
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);) T! L: y" M1 _, x+ U6 P! @
FIRDecimator_FIRDecimator(&pRxFilter);( |5 { r/ R% Y. j, {
6 I6 D" y/ ? }. h2 j6 g
/* Downsampling */9 n# w0 f+ l2 ~* K4 D
c_SymbolSynchronizer_SymbolSync(&pTimingRec);
2 Y5 J [) F# E, H6 x% i9 y" D$ k# J) e F' e$ M
c_PreambleDetector_PreambleDete(&pPrbDet);: U2 A0 n) u+ _( M
A. ?6 Y% ?# e y7 X6 N+ z
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */( {1 p# R0 I: o" g$ \$ R
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
: F/ J8 R1 A; }/ j) w$ J9 q- r- i /* %帧数量=100 */# b; a! R |$ v2 t4 s( T8 n0 u8 R
pFrameSync.isInitialized = 0;
; e; k" _; D) Y5 _) v/ ?% m
( X: C! D4 a: b+ ^6 R /* [EOF] */
2 I$ ]9 f$ w% M6 { /* 前导码长度是13 */8 o/ D0 @: f$ p) C# j
/* %qpsk */" s4 T( S, F i
pDataDecod.isInitialized = 0;
1 ^: h& Q4 n5 z/ p1 y7 \% e4 U# l' x
2 V8 T( Y& ~# Q, ^3 r6 ^. Z' r* M /* end */
0 N# }7 b7 ^2 m7 C8 U /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
. ^! S5 l3 c& @3 o+ v: g; Y8 v /* Convert 3-dB frequency */' p) W8 p1 I- x& g
/* Convert 3-dB frequency */0 E6 ], t3 a6 d4 T4 ~ l% {
filtfilt(save_buffer, usable_left_filtfilt);
& T; U6 E. p! ?6 ~" U$ ?/ k; y% q for (ixstart = 0; ixstart < 81000; ixstart++) {
! c1 s( \+ Y" J usable_left_filtfilt[ixstart] *= 2.0;
( c0 l3 c; s) W# E! o* x, S$ b }1 t+ w. N9 Q5 `& s1 g H
% x+ T3 G. ]# V /* 注意乘2,处理幅度 */9 ~! Y9 V, L7 Z
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */; ]- u9 L. t" z/ w: h
/* %% 行列转换 */
8 Q( {8 }3 P' o% v- Y& R3 E yiDuanShuJu_mean = b_mean(usable_left_filtfilt);0 _5 F8 C/ M3 [) l6 C1 K9 y
for (ixstart = 0; ixstart < 81000; ixstart++) {: o' H* G0 t) k7 h3 V$ U8 A' `
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
( B3 J5 h, m# v4 Q: Z" g - yiDuanShuJu_mean;
* U/ d4 x+ V: s) @ }
# |$ O' a, Y# o2 _1 f, s0 e% u+ {6 X" Y; n [- }
/* %% 应该对数据归一化,但是这一步放在哪比较好 */" R5 w# G& y5 Y% C6 y* |
ixstart = 1;/ q4 G4 i4 t+ r. U- u: d# }/ _4 t
mtmp = youXiaoShuJu_QuZhiLiu[0];
, q; n+ V8 w7 v* O5 c4 `: b5 N if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
& u1 {( t4 Z3 b S5 o ix = 2;
+ k% ~" `. W8 }, i5 ? exitg2 = false;
6 u( q3 }1 B5 G M8 w( e" y while ((!exitg2) && (ix < 81001)) { J" y% }# X3 V! p; U1 \
ixstart = ix;
" V# \; C7 N' d if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
/ S; H! I3 C& W% ~2 U. b mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
& z9 s1 j3 a; p0 G: G, z5 B2 m exitg2 = true;
* R$ h) q0 m+ z; M5 | } else {
9 C' a4 R, s9 l2 ~4 c ix++;- Q$ v. z1 ]% _1 Y3 t+ C
}7 R3 i0 j5 X7 V
}
9 I8 d1 Z0 ^ s0 C' D }
1 l+ E6 J* d; l1 Y3 ^$ r
4 X6 s r' P3 s+ ]8 } if (ixstart < 81000) {
7 }' H) P, U. v4 I while (ixstart + 1 < 81001) {
% i* c1 J# x6 Z9 v' ^ if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {4 m. t' T6 s3 D' E/ I. ?
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
! o; U( T1 a' k/ e, _) V) ^ }) O! A9 G$ }- B% f# Y
9 @; q5 c4 n( q. M# l- ? ixstart++;
" o/ c: ^3 A) I/ k' v1 g, k# J& n }2 Y u c& p# B
}
. ]/ |, E( ~/ V4 c$ x, M e
6 y4 {1 [3 q4 X# _: H8 N ixstart = 1;7 m+ `$ U- [$ \1 W
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
" L5 e# y l7 z5 S1 M0 x if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
" o& w2 ] Z5 H3 o4 S# y ix = 2;
" S6 `, u6 q, {+ |0 P! L2 _ exitg1 = false;7 \5 k0 {7 C: u. m4 t: Y% }
while ((!exitg1) && (ix < 81001)) {6 Q. z4 M; A8 A" x( S+ d: ?5 U5 _
ixstart = ix;* b% \! R6 Y G# m! y
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {) E1 n8 Y/ w3 [5 ^3 J* i
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];% R H2 y: F7 f7 a$ M/ [
exitg1 = true;2 C9 G# e" ]; o: T9 D! ~" [: |, R
} else {; k; p9 i0 F7 C. a8 n; k
ix++;5 Y- m, [5 U+ ?) ]" a. A
}
" ? H$ V) K6 d; Q6 A! X4 Z }
( U& e; G5 y/ p D6 T2 _) E }
8 \+ l8 @0 ^5 T' Z/ O
& d! x1 L9 V# T" w. |2 Z if (ixstart < 81000) {, ]) e/ p d$ E, V7 Z' b8 C9 E) C
while (ixstart + 1 < 81001) {; }( U" _* x: S9 y5 V* p
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
9 J8 s+ A% E' z, I- p( B yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];5 b3 d* S& M6 h9 r, r Q
}
4 A/ X* X4 C3 e: X1 Q3 h& q% L( ^) C- _
ixstart++;# R$ x2 U# ?* ?6 M/ T7 Y
}
3 b( U* E1 N1 N0 l0 ]9 c* g }. [! f- P4 ~7 ?! u3 S
. l; c8 N- D$ x2 r/ q- m$ F! Z+ L yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
1 h8 A- g; x8 p& V% ]3 t if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {: U8 l( E- i! A% U0 A
yiDuanShuJu_mean = mtmp;" v- _( j g. e6 B) y+ q
}
2 z4 e0 s: d. G1 w* S1 v3 ]4 p, b2 F1 `+ q$ U8 y4 }: u
/* 找出极值 */
* U0 H' a; _% \4 a; X9 G, x for (ixstart = 0; ixstart < 81000; ixstart++) {/ e j% ^, f$ x R; e
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;- u7 e9 B' m) F2 u2 t5 L
}
6 I8 x; d& T1 B. K1 ~
, q6 Y; {- o1 G, Q/ m9 K/ A+ q) ` --------------帖子字数限制------------------ z& m- d0 z. [& J2 W; X
}
+ Y! P3 K, @8 n" h5 x3 q: C8 e6 I n6 T/ m0 w1 r# D0 a4 |; j
- f& O6 Z. o$ f- o% {- |# X: R
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|