|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 + H! [$ x4 V2 O |/ i
" r) I& v' r N: F4 \8 f! @
各位大神:
3 [* H* ~" r3 J; |- \) j 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
. ~1 V; s5 P0 s1 L8 ?( d 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
5 ` O) o. d. H6 e
) L/ \+ x7 ^0 X3 Q + M" \2 d2 D3 J" d+ |6 q, o3 P) P
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。9 q( W% O; F! i5 L( c! O; P7 I
0 X8 D6 o% }! a
并没有其他线程
* V A4 Y4 q: o) w反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
! I* \+ f# ~% I' A) O8 [ ]也说不定是和堆栈有关系。。。。。。
2 S5 H5 K! t$ K请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....9 p; k I; r7 W! u! ~4 r
% d' F7 _* x& H" B( u
. w# Z% A5 V0 @# P
. G+ |& o0 e* a- H U9 M我也很绝望啊,希望大神能帮帮忙,感激不尽,!
/ a$ j+ a+ b" v; B: z
3 ~% ]' S D6 g O! T7 N( d) |( J1 |, H
) @2 U7 }4 R* \5 K A( n8 O5 O' w" C附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];5 t. T3 a) R x3 N/ L. c
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
, f; G7 L( L' ^. Z
4 y& o. g+ }# l' Gboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
, K! L: q9 V- R& e7 c7 @3 l2 x const double data1000[1000]) {$ e1 l! |2 z4 C1 I" x; W5 N
: ^9 G$ x" V& h% u& C int myfuck;
7 q7 m) Y& ~8 v double yiDuanShuJu_mean;
1 c0 c! r! {, e2 e, u double yiDuanShuJu_LowMean[1000];/ c0 m8 o% P( `% C1 `, @
int ixstart;
* D7 k* G* E) i; { double dv0[1000];
( Y& c0 G, l+ A" b7 R/ ?( V comm_AGC pAGC; Y ?; B4 d+ P+ Q& }
comm_CarrierSynchronizer pFineFreqCompensator;7 ?, @5 C0 G4 {6 h& n2 }
dspcodegen_FIRDecimator pRxFilter;1 W/ \9 W: A: g! e. S
comm_SymbolSynchronizer pTimingRec;: _4 t6 J3 x: F* H; L+ n
comm_PreambleDetector pPrbDet;9 W5 y6 U. w' d2 m" r+ X: w
FrameSynchronizer pFrameSync;
+ g0 c$ O, H s3 e, m QPSKDataDecoder pDataDecod;
- x; j1 ^' `) T; E% t" f( z0 J static double usable_left_filtfilt[81000];" j& l$ j) s+ `! l2 M6 t$ C
static double youXiaoShuJu_QuZhiLiu[81000];1 ?. e; }7 s5 k3 y( T) |' d! r# z
double mtmp;
, V4 O: j; P( S5 Z7 b1 }6 ?3 p int ix;/ ^- l! t0 I( h+ s6 E+ M
boolean_T exitg2;
6 S! @7 L' r6 c- H6 `9 Q boolean_T exitg1;$ q0 ^1 i4 X5 D
double YiZhenShuJu[800];, H2 x8 J2 V: ~; H! z: n) I
double dv1[800];
7 B! g( w. k6 t8 w# P7 O9 u
0 \( L" \: K. C% |% l
$ P7 J4 o* t- F1 v5 ]/ V) c) q3 [ double b_YiZhenShuJu[800];
& }- S8 m: s. c double I_filtfilt[800];
( U. A7 Q, V5 l6 G double Q_filtfilt[800];
2 Y! b( \& _: ]5 y, o- a+ _! E+ y* B creal_T b_I_filtfilt[800];
. k9 p4 ^" @6 ]/ q# {" T L+ N creal_T b[800];. t# P2 |8 f t7 B5 O, }
creal_T RCRxSignal[50];
2 f5 v" @+ W7 j" B { creal_T fineCompSignal[50];3 w7 g* t2 S' [" A0 T, |) R
double phError[50];
- f" S/ F* x* Z0 j0 d( L5 y! k8 L9 ~ creal_T timingRecSignal_data[28];
/ \3 U+ A) ?6 w: U0 l int timingRecSignal_size[1];
1 |/ p9 C# D: h0 h! c( i$ o7 J% E double prbIdx_data[28];( V; k8 D4 r- E- K
int prbIdx_size[1];
7 d* E/ y7 x0 [/ q0 |& {3 t double dtMt_data[28];$ i6 A% {( j" u6 w
int dtMt_size[1];% _& f4 r, E6 ]- |4 f/ e
creal_T symFrame[25];
1 z) P9 j, J- z boolean_T isFrameValid;8 Y* |* H0 g- G0 ~* I
double unusedU0[3];; e& [% J ?* x5 l
4 m, |( E6 S6 s; ` n- ?! d //调试过程中的变量
5 _. h5 m) E9 ] u& [: f4 Q int enough_data;. S M7 F9 ]0 D" d0 p R. t5 q
6 T" b: b8 R6 ?9 M2 E
int enoughDataFlag;* i7 k8 T+ S# A- l! j- j7 [
int yiDuanShuJu_mean_int;3 v$ M+ n# d: D# h! b9 D
int int_sum_dv0;
; k# o$ g) h) D! A J9 \! M' W; F int oo;! ]1 J7 |( S& E3 z2 c# B& P
int ii;
6 T/ v' K' b, [: L/ I' ~ myfuck=10;* ^) X( \2 `" _3 S
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
9 K' w: m' J4 S+ }' F3 Q" f; v& U /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
0 s8 E6 X$ h) u# X3 N- x4 P4 s1 C, k, V8 B- W
yiDuanShuJu_mean = mean(data1000);
! q/ ~- }9 ^: b# |$ ^) l
: k7 l; e5 R* {4 h- b5 P. X9 i* D yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
+ _8 e! ^8 x/ J" r UARTPutc('A');
, j% N: ? u% ?9 Z UARTPutNum(yiDuanShuJu_mean_int);0 u" ?2 K5 K/ `4 n) J9 I
UARTPutc('\r');" ~7 c# z! ~- @ v$ c% F7 B$ w
UARTPutc('\n');
& W; O0 Y: ?. S( K3 Y1 }/ V3 P
. V$ L6 E/ v+ ?; q! Z+ b8 x+ p1 @7 O for (ixstart = 0; ixstart < 1000; ixstart++) {
# {) O7 `3 m M* t: ?/ Q; M ?+ } yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
$ h1 V+ Z o2 m7 H4 ]- m& w }
4 D+ Q) r5 {/ d! J7 G3 o- W2 o! e
power(yiDuanShuJu_LowMean, dv0);7 K/ P, y- J" E$ B5 b
- U" M2 h, ?0 M
int_sum_dv0 = (int) sum(dv0);) M( u' L' K$ F7 ~
~5 M& O( l0 S7 \# x# n UARTPutc('B');
. J! F- \& G! N1 W- }7 N/ D UARTPutNum(int_sum_dv0);
8 e5 |& Y, q5 o5 ~( k+ _5 I5 m4 n UARTPutc('\r');
0 q4 r/ r( a& M6 _/ y" h UARTPutc('\n');
- z2 u1 g7 C$ }# }& Q! C6 ~* u
! ]. ?5 J8 L' W; ?// int compareFlag = int_sum_dv0 > 1.0E+8;
/ U2 q, h1 g( ?- P- L: t" \4 z8 P( G
! U* r6 R& s# d; B& T if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?1 k4 s: c7 P! R; T
UARTPutc('C');! x# ?; M0 W3 @' c6 P0 }
/* 比较信号能量 */7 G& y: Y# a6 G R7 x
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */7 _; j$ x/ `6 U R C- U( y9 ~% A1 v
// yiDuanShuJu_mean = 1000.0 * youxiao_k;
4 u2 R8 g! x/ e- s1 F// for (ixstart = 0; ixstart < 1000; ixstart++) {
+ n2 n% c% E! Y0 v6 }// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =0 H( K. y! S7 i8 m# b) L! V
// yiDuanShuJu_LowMean[ixstart];0 R: s2 l1 m3 V' Y e
// }
) a6 o" p0 X* n6 ]! P) v8 ?' C//, ^4 z f, h. p5 P0 j
// youxiao_k++;
! h) Q5 s1 K# U" e% S1 O* H// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==& U3 a; b7 W8 q! h
// /* 感觉要取21个数,即0-20, */0 e6 \4 _5 q+ J7 f) O
// enough_data = 10;//有效是10,无效是0
% M1 u) A+ o& ? j9 z( M; }- z// }6 n8 \' K0 h* f* A+ a. Y( x
}
9 u0 i2 ^7 I8 c' W2 A Z
. p3 T3 a! L/ u5 w0 K- x/ f$ B
0 u0 G5 S5 a0 v* r9 y9 | enoughDataFlag = 100;
5 F2 q2 b1 f3 g- b enoughDataFlag = 1000;
) I4 a. N/ Z2 ?; n7 x( F( q8 D& u; { enoughDataFlag = 0x02;* W* H; A, C+ Z& D6 g" N" h
enoughDataFlag = 200;+ c9 K0 y- _0 _9 v9 }
; ~# L2 q) z# ~3 B& j0 m3 {6 {6 I8 B int myfuvk1;
o" a6 {6 \3 W" O myfuvk1 =11;
9 e9 U% Q& J8 } Y. P- a* Z* r2 o" }" d% v* u( s$ W, s
0 Q. E9 C9 b8 H5 `8 D
enough_data = 0;. M4 b# J8 ~$ `1 P
3 w9 {7 C* v) {. |" L
// if(enough_data>50){
" c A* b2 T+ y1 D4 K// enoughDataFlag=0x01;4 j$ s8 F7 `" Q( L, n; w( n/ D
// }else if(enough_data<50){: p3 B1 u; Z/ r2 K, ^0 H) k( n4 O
// enoughDataFlag=0x00;//0x00还是不行5 \/ Y- ~5 Q# y( ?) x2 v' q
// }( A* u6 Y. _9 m) Z
1 O2 @+ k* G3 [" g1 s) w2 L* ~+ P
8 J+ D6 t% C! b' F" s) A6 i
oo=10;% z4 }! D v$ [# c% @. q
oo = oo < 5; ]8 y! O" P0 `! z2 H0 K3 _
if(oo){
* o. C- o6 l3 R6 H ii=0;/ j8 u9 N. Y# L
}7 r: p8 F$ L5 w
if(oo < 5){
0 a& g5 o! H5 O9 G. H ii=0;
9 E: J( `( M5 B4 m. x5 L& d5 | }
1 Q [2 b4 i8 `: @ if(oo > 5){( y% A8 f5 i: s0 l+ N. n
ii=0;
& c2 i1 y# ]1 ]1 H1 u }
0 n& t, v* D9 I" y, w! k2 [% |- a2 \1 p9 o3 C( ^ V" ]
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
) J0 ^5 N( [+ ]) x% u0 p /* 如果数据足够才执行主程序 */$ V0 c- r5 I( [; m; P
oo = oo < 5;5 d: D: R+ Y7 \, s, C8 ]6 U
enoughDataFlag = enoughDataFlag < 5;
( i8 g5 B) M3 i9 { C if (enoughDataFlag < 5) {
{- e9 w% `9 d: ^( u3 o// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
) q, k. g, ]+ e AGC_AGC(&pAGC);
! \; V# u1 X; |9 x# z9 s& k, C2 S- V$ r6 K, r( c
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
( s2 J0 E$ {6 X5 M# } ]# G FIRDecimator_FIRDecimator(&pRxFilter);* @$ B; E# j$ }) ~" n4 w" `
- o+ f. ?- l$ ?( p2 B
/* Downsampling */8 J5 N. }1 A( z
c_SymbolSynchronizer_SymbolSync(&pTimingRec);
( \/ e3 W0 C. b2 V2 h) L' o6 ~# H1 D- [" L
c_PreambleDetector_PreambleDete(&pPrbDet);* X" ~# C4 R+ ~7 }
6 @( H$ ~0 E/ u) w: x! s, ]: B /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
7 j8 k1 ~4 R; \" @- |$ I& @ /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
, `6 K- \. r' J8 k* H; L/ q /* %帧数量=100 */
! G6 j- Y( d3 [# A pFrameSync.isInitialized = 0;
4 K# Q$ t+ u5 M9 R9 U% }4 U8 O3 K/ s& t" T. U
/* [EOF] */
P a u. }, O4 N/ G& L6 a: H. X, P /* 前导码长度是13 */: D2 K1 z! @/ q f
/* %qpsk */
/ {5 X! w; D0 I3 s6 p pDataDecod.isInitialized = 0;! v3 ~' `5 S7 L0 o: i2 U
+ {4 |9 I+ ^# V$ {, T; z% K /* end */
) [3 ~6 ~+ ^/ w' j9 E9 X H$ f /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */- {! }' ^: e; \" f% S3 i9 ~6 M
/* Convert 3-dB frequency */
3 Y# h9 j* g1 v! W /* Convert 3-dB frequency */5 C8 l @& G3 E7 E* ~/ V! C
filtfilt(save_buffer, usable_left_filtfilt);
" T: _$ j, ^- p f# K2 n: S$ O for (ixstart = 0; ixstart < 81000; ixstart++) {8 k5 G8 ?5 K8 u( Y1 z. _+ s2 c" v
usable_left_filtfilt[ixstart] *= 2.0;9 R1 c2 J1 T* D
}, L, U' ?: j3 J/ g7 `* {( b) V/ @
& R9 I* k3 ` S) p
/* 注意乘2,处理幅度 */# \5 T) |+ V8 ^/ g; o* r
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */5 j. h3 _- M: n. l" Y( S
/* %% 行列转换 */' h) j g) o, c) Q, A$ f
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
% g4 F% a4 H; r, H! v for (ixstart = 0; ixstart < 81000; ixstart++) {
5 V8 \ L; ]) @5 M, H youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]4 a. G% C9 k8 j+ S2 @
- yiDuanShuJu_mean;
* U$ H5 ]6 X! T }4 Y" v% u, `2 |% G3 C; H1 m
V/ Y+ W" D. I# I6 k
/* %% 应该对数据归一化,但是这一步放在哪比较好 */4 _. ]9 F1 M4 V: ~) F
ixstart = 1;" d6 U8 w& D: O+ T* |+ a
mtmp = youXiaoShuJu_QuZhiLiu[0];
: q: g. L0 C. u3 a if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {9 H k% [' o+ l3 J& `1 p4 ?
ix = 2;
. V; n! K$ o0 R! \0 {$ h exitg2 = false;
/ B. X) u- o. [: q/ i while ((!exitg2) && (ix < 81001)) {4 A i$ i: O- ^# r5 k% G/ N4 F
ixstart = ix;
. u$ [4 R" `, J4 ~) `5 H+ q+ i if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
1 g$ f0 T3 W3 U+ w mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
' l- N7 N& Y% I3 k8 ? exitg2 = true;
8 ^& v7 b+ ?( p/ h) {( U2 p } else {
# k2 j- k. R& O ix++;9 W. W5 j2 Z% }1 ~8 y6 D4 l
}4 b2 V! ]8 `/ }2 ]/ q& i' w
}! E0 a4 N& \# e( U
}
' f7 p$ A% N/ c% s7 ]
& G4 S1 y2 w1 S) a3 _ if (ixstart < 81000) {
; s6 V7 W) X' I9 I+ X/ b( g- L while (ixstart + 1 < 81001) {9 t& m% j( A3 U+ D" h) O5 o! a
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
e) t o$ {1 M) A: c mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
% Q4 \. w. e3 [9 T, Y0 l6 g }) g6 h$ N3 _- a. J4 F8 |* h$ \
- n2 `# o5 u$ {1 m( i _6 Y: z
ixstart++;2 A; V( f6 t9 g) L0 M
}
3 k0 U; P$ A9 }; c1 [ \+ o }
4 k9 R Z" Z8 f' h' g- @/ @1 \# \7 Q) C* X, ~$ u: I
ixstart = 1;. I6 ?$ o+ _7 U
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];" P& \/ q: M& f. K6 l* P
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
7 x+ E" w& S5 ?8 n, O2 H3 G ix = 2;
, J. [! C# {! V* v) K* E! S exitg1 = false;
`* h, F- D6 _1 }& [2 L6 j* r" R while ((!exitg1) && (ix < 81001)) {3 V$ P. w* E* d$ h4 |
ixstart = ix;/ O4 `% K2 u- r* k
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {1 R! @0 p6 Q) M+ D
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];( n) E4 G6 Y) R1 N
exitg1 = true;
& d' m: D4 \ d } else {
/ @0 c5 @& y5 ^ ix++;- r- r7 `! _* Z- Y/ k, e: c! b
}$ ?3 m% O9 P2 K1 T: V
}
- ~! |/ B; v f: i }- ~0 l3 c8 @. X* _- j P4 E) H
" {& L Z* f0 Z* i if (ixstart < 81000) {
4 W* d9 \6 W+ n/ v4 S O while (ixstart + 1 < 81001) {0 p& y1 E; o6 p6 X
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {5 v% ^- \5 Y+ D& @0 N0 m- h
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
7 @0 ?4 N4 N: ~4 a }
& ~% S7 v; O: N$ f3 [( x8 H( q+ F3 k: Q, j# v' X
ixstart++;
) ~$ E _( Q) y& A6 O- I }
7 B6 X3 X' h. O' G2 G& K/ E) _ }! d, W7 m/ h1 C+ H' D1 A- R
: k* i, n, I- J
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
& p: P5 u9 [0 [3 }, @ if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {1 x/ X- F& U6 z) } F! R$ H m! q
yiDuanShuJu_mean = mtmp;( T' b8 M8 I, F a8 d6 y0 y2 j
} h* v- D/ e" P9 `$ n/ W2 H
; j. x$ Z+ I! P /* 找出极值 */4 p7 ^0 C8 c! ]$ T3 A5 C0 W
for (ixstart = 0; ixstart < 81000; ixstart++) {1 v$ s& [2 |& P4 N" J L. U
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;5 `, n. N- E* _% O
}
, [6 @1 u- O' B/ @! v+ B; r+ S' {$ |! ~! D: y5 G! V9 t7 s: L: d
--------------帖子字数限制------------------
, ~2 a F- q J+ J}6 \) }/ ]( g" ]5 Z6 t& U
' u9 ]8 K8 V) h' [0 e9 l
, Q" `. t; | ~
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|