|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
% D' G& D7 j8 f1 t# d" a# u9 ^% x) {
各位大神:
1 |% @8 O( w+ z 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
" c4 n- |5 g2 w6 [: Q, X 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:* `% j/ N3 z/ y5 m! ~
9 @5 r R1 |- ^- H, |3 r K# g + H* Z" l6 q/ x3 b% {' J
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
, P; ~2 {3 g9 F4 d/ f+ c+ v8 n! J) M& o7 h8 ?/ M3 \# O
并没有其他线程
! }1 ]2 I$ W' a2 o- V反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
S: P* @- S- k+ a' X3 X) H6 F8 h1 j也说不定是和堆栈有关系。。。。。。: }+ N( L% T1 B; L3 z
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
9 ^' _4 p3 H6 h K; }% b4 x+ q1 R6 y9 g# U6 x8 V' P: o. g. e
8 C5 ]9 T& a4 }, G1 q# _7 w
4 s# s) R) \4 F1 |3 \8 [1 s' M& p我也很绝望啊,希望大神能帮帮忙,感激不尽,!
8 b* I2 M0 E4 T, K: C
! s( N' T! C6 @- D1 y0 z5 d# w
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];( {+ g: j7 Q( |/ X6 G
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
' c& `* e' l. x0 F
/ r7 T3 S4 v5 G' Oboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC( p" n4 ^% S. P. k4 ~* y* X7 u
const double data1000[1000]) {8 \. b! | N. k. Y( u! Z
. H3 ^4 |: N$ B, f. |2 v/ ^6 ?! l
int myfuck;
% ]+ X }( E. f' k3 j# s double yiDuanShuJu_mean;: ~6 H- _4 V& k" _; y' M: J/ C
double yiDuanShuJu_LowMean[1000];
& T4 b' ]8 a# [ int ixstart;' C. }8 ?6 |2 w: y& b
double dv0[1000];
0 J' h( w+ C" `8 k. f6 D0 a comm_AGC pAGC;7 K$ t* ?0 j6 a% m( E9 P
comm_CarrierSynchronizer pFineFreqCompensator;
% ~9 I1 ?/ I! ?) A" P: N5 y dspcodegen_FIRDecimator pRxFilter;/ E) V1 W2 n0 w: M- y) z, R
comm_SymbolSynchronizer pTimingRec;
4 n0 K: @4 J! j# O9 e/ U6 @/ V comm_PreambleDetector pPrbDet;
8 w6 N7 B1 H) l- v# z FrameSynchronizer pFrameSync;
3 q' a; a7 _1 F) C# { QPSKDataDecoder pDataDecod;
v6 J: @; @0 m static double usable_left_filtfilt[81000];
9 Q$ m W9 f1 m' z& r static double youXiaoShuJu_QuZhiLiu[81000];, @0 _+ A# J, b/ u3 D
double mtmp;
0 v' F) {5 N( C" z5 C) { int ix;
1 G# ]2 i/ X( s2 I& f9 v9 g. b4 l3 @& L boolean_T exitg2;
6 b' Q/ ^: ?, e boolean_T exitg1;( q7 L9 f- o! d1 q+ \& Z4 D
double YiZhenShuJu[800];
( ]# |' T. o5 F8 ^. B6 ~1 U double dv1[800];# M3 z7 L+ [$ i
b( ^ X! o) e& n
: T4 j0 B w. M; H6 E/ n double b_YiZhenShuJu[800];
6 _' a( D% l1 t Z7 t+ d double I_filtfilt[800];
* |; L0 H: C0 X# r6 d( `1 G double Q_filtfilt[800];( j Y* Z1 S, |: U0 s% Z* ?
creal_T b_I_filtfilt[800];6 T! Q$ C0 R# z- H
creal_T b[800]; P" x; c' Y& H
creal_T RCRxSignal[50];
7 Z4 i; f3 v$ l6 N8 h creal_T fineCompSignal[50];# t$ v" m8 A Y: u+ o
double phError[50];
4 n2 O# a8 G* h! r. F creal_T timingRecSignal_data[28];
7 |; n& D* F; C" w! h d! n int timingRecSignal_size[1];9 {, c/ _4 c4 }0 K
double prbIdx_data[28];! l' h9 F( `. k+ T
int prbIdx_size[1];+ p3 G$ ]0 i6 `
double dtMt_data[28];7 B Y( t1 g- N
int dtMt_size[1];
) V) {$ v: J3 o8 [, l& E2 q& V creal_T symFrame[25];
I( C6 i* T: }0 ^" @. f boolean_T isFrameValid;1 T! y! W4 ^% T7 u/ m4 V: _# Q
double unusedU0[3];# ^% s! k' t5 R' }8 r6 {8 K
9 v2 e3 f* J( Q- O) `& \ //调试过程中的变量
, ]% a* @) W! w1 j1 [+ a int enough_data;
% ]- w F7 E1 F! I: L; }* l; {% o
8 b9 |$ u3 M0 B0 F5 d. `' f1 p9 y( q int enoughDataFlag;
& d8 o/ j+ C; ]% r& ^0 K1 J int yiDuanShuJu_mean_int;& C& n0 q4 }0 p# i" p
int int_sum_dv0;
4 F1 [* k. L/ [8 ]& [1 i& a" i6 L' V int oo;& }; z( I0 I$ A$ m. O' _) S
int ii;; _; c" Y K5 l2 l5 `6 [$ X0 f7 C
myfuck=10;
3 O8 k3 n7 Q+ ~) c7 Q- ~ /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */ D( u9 P @1 B6 j
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */0 { O' D1 \$ {" H- x+ I
6 E4 a$ i1 V# q, | yiDuanShuJu_mean = mean(data1000);! K& b+ a5 E S/ Z6 f
# m% d. h/ P& L" P0 U! S1 ~
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;$ _5 f t/ I4 t' g8 N$ Z" B
UARTPutc('A'); t( a- u' B, }& Z2 A: K7 A& v
UARTPutNum(yiDuanShuJu_mean_int);9 ]9 e7 X1 r# u9 p" X! Q
UARTPutc('\r');
, c/ c, ~1 u, o! B5 A, Q. g& T UARTPutc('\n');
# v' z* h9 j) D+ l2 a- T1 P% I X/ j" r/ L- Z( T( w$ K# D
for (ixstart = 0; ixstart < 1000; ixstart++) {: N: \$ C/ m3 h8 a. O1 _- I
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;2 @; i; s# q$ ~- Q
}
+ k5 o2 [/ ^2 w. H/ f( }; e
! {* z. k6 x! G( k$ a power(yiDuanShuJu_LowMean, dv0);- \, {3 E [0 Q4 _# a
( G6 u/ i+ |" A9 Q) J; ~8 S1 t9 v$ { int_sum_dv0 = (int) sum(dv0);
9 `. m, \7 _: f+ E6 ]
. I8 j: L( r6 ^1 l- l UARTPutc('B');
2 e5 R) u i7 A6 E# l" K& w UARTPutNum(int_sum_dv0);( H/ w/ j5 L' e# {" e) S5 l: @: Z0 C
UARTPutc('\r');
7 a$ h& x1 j, O* f6 U* K. a UARTPutc('\n');3 K4 w/ Q( ~8 K. c% w/ O( _
/ f0 Y& L. W3 s! [& ^" o# B; v
// int compareFlag = int_sum_dv0 > 1.0E+8;% C. @" Y; V! U: B3 F/ n
1 c& e* h* b2 a" ~, ^
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?( ~4 U) D( d5 G, ~$ H
UARTPutc('C');
( c! g/ y9 Z6 r7 J3 J: D* {/ Q /* 比较信号能量 */, i; e2 w5 N( ^ i
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */$ |' n! r- J. x8 T( n# o" C
// yiDuanShuJu_mean = 1000.0 * youxiao_k;+ }6 w* ~: U0 X$ ~* p1 D
// for (ixstart = 0; ixstart < 1000; ixstart++) {
, V% ]" C9 Q& r+ K// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] = }( f, f* M4 Z: y+ R- _
// yiDuanShuJu_LowMean[ixstart];1 [( n; Q) y( c7 o! m
// }( r8 r. ^ s; [4 N
/// k+ x- D: S+ S) P# d5 Z' V
// youxiao_k++;
9 M& `9 d2 h- v3 y4 l// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==4 u7 F& C' r5 x! F1 y
// /* 感觉要取21个数,即0-20, */
: S! I f5 B @) X// enough_data = 10;//有效是10,无效是04 t) u/ F$ @4 F2 \) e/ w9 F
// }& ?6 n7 F8 M6 P! `
}
2 b0 o2 j7 S1 \+ m. o& C1 s, V
; S$ @# D2 _( ^; a$ m; B2 d% x6 @# D7 G) F/ I2 L' N
enoughDataFlag = 100;0 ^! U0 t! d* t" I+ P0 s3 I" J" x i
enoughDataFlag = 1000;, X8 f E/ }1 }4 r3 I- E9 O
enoughDataFlag = 0x02;$ N! Z! {9 {$ ?4 R. k
enoughDataFlag = 200;$ X8 u+ H9 y6 E" D; ~+ ^
; f. e8 b* ]5 n% i
int myfuvk1;( H5 `% b' K. X1 ~! E* d% [
myfuvk1 =11;, N9 X V$ p' {; i2 Y. O% N
, x! x0 P9 j$ v" \
* J2 W0 @0 z/ I4 j
enough_data = 0;
4 {" D( m9 U- A0 E. j2 l
; n. e/ i6 l" Z* Y& o9 x9 I// if(enough_data>50){
6 e8 t4 j; ^; d$ `2 P5 c m2 o( T// enoughDataFlag=0x01; K' I# Q5 r) L& n4 I% O
// }else if(enough_data<50){
9 H, F* E) v$ U$ C0 Q; }8 w5 v// enoughDataFlag=0x00;//0x00还是不行
* `9 A! a E6 d) @; [3 f) H9 f// }6 i9 o. j6 Y0 Z' A% S3 e; _* }/ a; R7 W
; k; y2 B# H, L% R% P
+ g7 P) o- F" ~7 x
oo=10;1 q5 H- e* G f3 r3 a% f, S5 f
oo = oo < 5;: |) F, e& @- O, @" L
if(oo){
6 R% k* ?8 B) _ V# a ii=0;& p1 P6 I, i8 o+ g6 d/ o
}# G0 h$ T" v# e4 f: [
if(oo < 5){
- X' X1 k k/ j* D! j, \9 y1 j$ | ii=0;
4 F8 Q4 \& \: O* \) H. B }
; |# ~/ t8 X6 } Y+ W if(oo > 5){
+ P) L& p( C& P, t9 w ii=0;4 n! v" n/ k- h# ]! d
}1 Z9 \: Q5 {$ Q! Z+ y7 o; y4 h8 ]
- D: [" q' c( f9 \) }
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */9 \, C& G6 d; N+ Q
/* 如果数据足够才执行主程序 */
# Y, g( n0 }( y7 `! }9 f oo = oo < 5;# {+ h/ d. Z0 G
enoughDataFlag = enoughDataFlag < 5;6 L# B! k4 D# A- k* l4 K
if (enoughDataFlag < 5) {
( b9 S7 f; r4 A1 O+ ^// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0' p" s- F, ^0 u. m2 O& X6 V) [- m
AGC_AGC(&pAGC);2 F% |" q- C" U5 K- _# J
% W) {' `' H0 r2 {7 p9 ? c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
$ Y* B& g5 F9 {. p: @- k/ T$ N FIRDecimator_FIRDecimator(&pRxFilter);
& u, [0 t' g: O g& @
2 _" y- o7 B; }& K0 ~ /* Downsampling */
) l0 N- L& M. `! Z3 V; j0 ` c_SymbolSynchronizer_SymbolSync(&pTimingRec);
8 c) v% S) Z& e7 Z$ W6 Y w: a9 i& Y" i# _
c_PreambleDetector_PreambleDete(&pPrbDet);- t2 }8 k: s( c% G4 j
9 b* t. R- _+ {& p$ A8 s: p
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */: `: |! F& P' p3 j" a
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
) V/ V3 T% M5 K3 l2 i /* %帧数量=100 */
/ u. c; q$ b, I( V$ E pFrameSync.isInitialized = 0;- H) O. X! B3 Z% _# O& L' H% {
* d1 j# ^3 m. Y6 f" }' |& Q /* [EOF] */
$ L8 ^1 D3 C7 o$ D! [. ~) f /* 前导码长度是13 */" _* Q& S6 Y3 \& X' j+ |3 \
/* %qpsk */6 R, F4 G. ?* e7 c! p7 h) t5 {: d5 A. ?
pDataDecod.isInitialized = 0;
- |5 m l, C: Z4 F# k6 e" M3 w4 ?% J v1 Z) Q _% \
/* end */
* c! w: g, `. n7 A7 B. ^& C /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
; A3 d" d: p. u6 S# ` /* Convert 3-dB frequency */
; K. P0 x" Q% y: W) O' Y! k; O /* Convert 3-dB frequency */
* h6 z" o0 N/ X* f; j filtfilt(save_buffer, usable_left_filtfilt);# N8 s* {) J2 x' W$ k; K
for (ixstart = 0; ixstart < 81000; ixstart++) {, R& |8 w6 l+ Z) p( ]; c& Q. Q
usable_left_filtfilt[ixstart] *= 2.0;' u. ?1 l2 i2 A# r4 P2 R [8 `# ~
}: @* u( w6 J0 W$ s' ?# d8 t/ K
2 L' w t# E* R8 K /* 注意乘2,处理幅度 */
& q) }8 g* E* O) m# u7 m /* %% 我发现带通之后其实就均值为0了,不用这一步了 */
* d+ ]9 Q. Q/ g' O /* %% 行列转换 */
+ H, g. Y1 r; P6 p yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
5 D3 |! {. ~& Y" L; u& ] for (ixstart = 0; ixstart < 81000; ixstart++) {- f& p- n F6 W% _3 N6 Z) Z
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
# Y! R3 b/ x# B4 } - yiDuanShuJu_mean;
. r% ~; L5 h1 e; U# B0 K }4 |4 K: C4 z$ u3 j8 r8 ?
0 Q, M' S* x' U: x/ e /* %% 应该对数据归一化,但是这一步放在哪比较好 */, A3 w( ~2 c9 t1 k( c' S
ixstart = 1;% L$ Z m& Q/ X0 J
mtmp = youXiaoShuJu_QuZhiLiu[0];
; h" W9 m% d( w6 C- H if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {& u$ s& ~- B( D
ix = 2;
. }* r$ }/ s& V# M2 ]. {1 Y exitg2 = false;+ X* c* D/ X# D: H; j0 L
while ((!exitg2) && (ix < 81001)) {
/ G/ y: i$ A* c# Z0 V/ F ixstart = ix;
) l- _4 T: d Z* X3 o* a- E if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
2 H" P5 L8 @: h% n% k M mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];+ j6 ] A* _8 t
exitg2 = true;
* \) F' N8 m5 e1 Y# g } else {
! ? F; l4 L# w* ? l ix++;; [. v9 h+ _8 j; h9 @4 O
}
, ?1 s0 H% ]6 B# T' T5 p+ \ }
+ u# {/ p. j) e k( s }: j }7 e7 @9 }# p4 h- N K
% T1 n. G! l# l9 D* c T& S& W: } if (ixstart < 81000) {% m3 l- |* [/ o2 b$ X
while (ixstart + 1 < 81001) {$ z% v5 Z) e: t! w. R* }4 t' V9 |8 [
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {4 H% D# ^9 U1 r( H: f
mtmp = youXiaoShuJu_QuZhiLiu[ixstart]; s Z% m' O8 T, C4 ?$ G
}
; P- d6 w& N6 C' i9 K( A
! p/ W+ l' X4 _- M* B ixstart++;7 N$ o, ]0 n8 Q. @$ e% N- P0 y
}
( b3 l' o- W2 [2 _. A }
8 Y4 F+ h! \$ K" L( l+ n" V& I+ R1 i6 G% V1 t8 n
ixstart = 1;
( y; L2 h/ a: v9 E! s1 n, Z yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
( c5 p, F* b M) w/ x" p if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
9 d7 y* z6 N: P0 n) N ix = 2;
3 G$ E- p: J( i9 c" [: O4 i+ Z exitg1 = false;
" |2 w- n" B$ @ h- M ~ while ((!exitg1) && (ix < 81001)) {
/ i$ N, x. i0 _) b& r' ]" b ixstart = ix;* c* V% B6 A; U6 U d. s
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {. ~" `! }1 y" c7 j: b
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
* C R/ _0 J, o exitg1 = true;7 m" s, t# x# @: Y4 Z
} else {" U& q+ H" _; l& m4 L% Z$ z
ix++;
. C$ J/ V; b; `2 T$ r' t }
0 M. @, z7 d8 ~& F- N. P }( H" K4 x1 f! i L0 B8 [: R7 W
}
! I" o, W, e3 z4 N4 E6 m
0 c; }# k& m9 Z* \0 ~: A9 m" W8 I if (ixstart < 81000) {
# c3 k2 l% [! ~% ~# |% Q while (ixstart + 1 < 81001) {! ?' F) O) n6 N% A4 L+ }6 y
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {1 l# ?" |; l5 V5 |; G
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
/ k* ^& P7 @( J1 I) y$ t, z) S0 m }
2 _' T6 ]9 k9 @9 e# X& L( V
* ]8 j- |- B, h8 |, v6 Y9 E ixstart++;+ Q# Q( e4 D5 Q
}7 ` m4 X' A! q9 f' L( }& P+ R' i
}- z6 ?" n8 }! H& Z/ s; G! H7 F
4 `/ ~$ P- ~/ M3 J& G4 l: C
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
9 n3 a: \7 O: U( j: Y; [. F3 s if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
0 W) V, n: t, ~! G! J& P yiDuanShuJu_mean = mtmp;9 Q7 W3 S }. P1 S3 w. I
}
" }. `& Q) J% v, u! K4 c9 P
+ F1 w* q$ { ?9 S /* 找出极值 */
2 e; z. ^0 A2 R9 P& h for (ixstart = 0; ixstart < 81000; ixstart++) {, w7 f: J% G( _' Y7 j
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;" O! }, g k& L3 h
}( Z2 e' c- {3 G4 `( v# t# Q! }
y: O3 e& O. u( z* _ --------------帖子字数限制------------------9 t) P6 v" L; c, O
}- d0 Z- O& _' {
h$ F6 s4 K# M! P
% b. {; \- @& X. {. K* ~9 _0 Z |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|