|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 / s% n7 I9 h* A8 p
3 P3 ?5 ~4 H U* ]0 E
各位大神:; `5 r: |4 M! c/ f/ G
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
& z" s3 Q% T. W N- o) l V 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:5 Y( m6 b) v% @+ M, h
3 {& v- o6 y5 [4 R: _
2 Z/ w/ ?, m5 |& A这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。1 @4 t8 i' e4 U. ^( [0 P+ h/ f
/ s: L+ I0 ?* E: m
并没有其他线程
c& C2 O$ g8 n' F7 u% |. O; ]+ z8 ^- X反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。" Z& \" v) P' Y' s4 K4 O8 O \8 d1 E0 b
也说不定是和堆栈有关系。。。。。。
/ j8 e1 w" D4 ?4 K# b }$ r- F请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
% K) i" R7 K: F. V: z0 v) c9 w4 ]6 u
$ { ?+ n5 U G3 d" G' D, t$ K/ G* a' B% T$ A# j- O- I
我也很绝望啊,希望大神能帮帮忙,感激不尽,!
* w9 g+ v. x8 k$ P
3 h0 d( `% S: b! G
% ^- ?/ H6 @; S, Q) Q附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
+ ^! M& `- `0 v" }0 J static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
1 B+ s5 ^8 e, ?4 W U! e1 k6 E
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(0 G$ W! ^" f$ }0 ]+ u
const double data1000[1000]) {
, O* x# ~% ^. {. ~/ U$ p) o: V1 g! n3 t% v3 ]# W5 G1 `
int myfuck;
, `6 ]9 m) U7 K) o% l6 T double yiDuanShuJu_mean;
/ k6 b6 [; m9 v5 y q double yiDuanShuJu_LowMean[1000];5 S2 _3 l3 y& o1 n
int ixstart;
0 P, i8 L' K6 q1 q$ [ double dv0[1000];
- y' |1 g M; | comm_AGC pAGC;
* R/ ?- j. K; J2 O! r comm_CarrierSynchronizer pFineFreqCompensator;
& c6 \; Z8 i+ K# F6 P# B8 O( ? dspcodegen_FIRDecimator pRxFilter;
% } C6 n! g" n+ v, i5 [- F& l comm_SymbolSynchronizer pTimingRec;2 M& D1 I; c' M( M7 [
comm_PreambleDetector pPrbDet;0 l- R7 `6 K) k+ {6 l
FrameSynchronizer pFrameSync;5 C( K7 c. [6 J9 G- X
QPSKDataDecoder pDataDecod;3 Z5 c b0 B8 ~
static double usable_left_filtfilt[81000];) @4 P! }+ t6 E/ Q1 h* m& U
static double youXiaoShuJu_QuZhiLiu[81000];
' h( a* ^0 |- k% i* t! F& b6 u double mtmp;
4 G! m9 @1 u- n, e& q! p! N int ix;
- d4 E) v/ y, B; N boolean_T exitg2;# l/ u" G/ H7 i7 {; j a% G
boolean_T exitg1;
" G7 \+ S9 F0 G! h# a1 d5 W; t! g% ? double YiZhenShuJu[800];
3 R" j. D: ~. f/ j double dv1[800];* ]) K* t4 O) R' L2 l
" V3 @) W5 @) u$ u9 O8 k5 Q* J! @
+ G4 e/ [# B) e8 U9 { double b_YiZhenShuJu[800];
. g! J5 e" }9 p/ h0 ` double I_filtfilt[800];
& E, m9 s+ f6 y5 p/ y% o! u7 j1 L double Q_filtfilt[800];* A! I. i: M M: L# @
creal_T b_I_filtfilt[800];
5 W$ C% ^8 }# k2 n, }1 V7 K& U6 ] creal_T b[800];
+ z+ q; X: a7 R" c5 O% |2 c1 l3 g x creal_T RCRxSignal[50];
& ], R1 b+ z# z* @1 x a8 H( \# ?) T creal_T fineCompSignal[50];* k) I% R1 t4 z
double phError[50];$ E, p* g& T/ Y/ y' \& l# ^
creal_T timingRecSignal_data[28];
6 e2 J: ?9 [# b( L* ? int timingRecSignal_size[1];
! \% G+ T; t# d double prbIdx_data[28];
! d6 ?; t0 ~% a1 u int prbIdx_size[1];+ b1 k+ c3 L: H m" A U" j- {
double dtMt_data[28];0 R8 r: V# D2 f) h4 A0 T+ {" ~
int dtMt_size[1];
% K: a2 H% ~1 i: c1 c8 j& S creal_T symFrame[25];
A0 N: l; F+ N4 N3 E boolean_T isFrameValid;
1 [8 O) k; A6 v6 q double unusedU0[3];
0 p Q2 w9 K% I" n: X7 i" ~( |, h9 _# l K' z
//调试过程中的变量
$ K, e& F* L" L9 c7 ]: W, ^0 _- F/ H int enough_data;+ v' f, [$ R% R3 r# z
. A* x" Y0 o4 D. R
int enoughDataFlag;
6 K( Z8 D3 x* k int yiDuanShuJu_mean_int;
; ~3 K. g" V5 ~ int int_sum_dv0;
5 e& | u# t9 Z' P* D& H int oo;/ C7 a1 M0 D) x3 X ]! D7 }
int ii;0 ?! Z. q3 t D( B; L) t
myfuck=10;, T" `/ \; y; n# g; d! ?, L
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
1 P- V9 B1 `( K( J( T7 K /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */& h% V+ f6 S( f3 \
, \' x1 E* X7 ?8 F5 t% P) U* T) D yiDuanShuJu_mean = mean(data1000);
/ h# O8 B% T; V$ G1 H, n4 n# B# O) T3 n
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
/ ?& L$ \8 P7 t5 r! E- l UARTPutc('A');9 e {& h5 t# \: y6 Z* w, D+ q5 h1 I' }0 S
UARTPutNum(yiDuanShuJu_mean_int);
* L1 n' U7 Y( r0 B- y( C" A- Y' N UARTPutc('\r');
" x( R9 S$ m! W UARTPutc('\n');
& S" j7 H Z9 z+ x+ Q+ E# w: ?* h; o6 ]
for (ixstart = 0; ixstart < 1000; ixstart++) {
% }, h( F* y& G( S+ M; z yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
, b! S0 s* I" j4 H. B* p, ^ }4 Q' \! m- w* ] P+ P
' u- h" H9 `2 G1 t: a power(yiDuanShuJu_LowMean, dv0);
6 f) m5 E" S y# _, J8 r/ `3 p! Q/ ?8 ]0 y$ V5 h7 L& Y7 K$ q* f( g
int_sum_dv0 = (int) sum(dv0);
! R- r' G3 w$ A' `7 i0 N: `- T3 H. q' o: K$ y. L& M
UARTPutc('B');
9 c* i* \* Z" L. o UARTPutNum(int_sum_dv0);
' j0 b/ m" U7 | r5 i8 j5 X UARTPutc('\r');/ ]: g5 m$ ?4 A0 n% l
UARTPutc('\n');1 o3 r, {) S" @) X% [
6 p9 z* j' z7 P. A
// int compareFlag = int_sum_dv0 > 1.0E+8;/ N1 y5 _: t6 W. x8 d* U
1 r& Z" J9 b( e
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
: |+ s5 f* _4 S9 _ x UARTPutc('C');: ^/ Z6 B0 L/ F4 y+ p3 J& H
/* 比较信号能量 */
$ p4 ~' r8 G5 ?/ F* `0 Y6 c /* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */0 ^ m% F& q H R& r# a% o
// yiDuanShuJu_mean = 1000.0 * youxiao_k;
: f) ^: a! r& \( {- w1 I/ m// for (ixstart = 0; ixstart < 1000; ixstart++) {# E: p0 P. {# {; L; g" ?7 |! g
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
1 s A, n6 a1 H+ {9 L+ |1 ]// yiDuanShuJu_LowMean[ixstart];
$ C9 Z9 j, Y3 D) ~3 U// }' {; c% W# e5 }' D9 c
//
" s3 r+ L/ }& c' t' F6 D' Z// youxiao_k++;$ U `. b; {, K: a
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
$ m9 ?, E) O! D+ k3 `$ S// /* 感觉要取21个数,即0-20, */
& @ A4 W7 S1 s3 P3 c// enough_data = 10;//有效是10,无效是0$ ^ |) g; b2 t5 `) w
// }
- O* Z1 N$ p) l }8 Y3 p) P$ w: i* }. f3 n7 b* H
9 h; |9 h8 }1 ^0 `+ d7 @/ P# O
/ L' f" P, j1 n9 u6 u enoughDataFlag = 100;) Q: K3 }4 [1 w3 R/ G, i5 D6 j
enoughDataFlag = 1000;
: N u" W) k! m! W1 u) s/ a enoughDataFlag = 0x02;; K9 s3 p, K4 d$ I1 v5 M6 a* y
enoughDataFlag = 200;8 d- }6 B. ?4 D k
- W& c x+ H' g2 m1 [1 a
int myfuvk1;
3 C$ u% I1 T: O( y% l `8 P( a myfuvk1 =11;
2 r% C9 Y0 a! z
! z. [- m- I T# \
2 m, ]" k) ]1 x- H* y% ? enough_data = 0;& h+ u5 V! _8 j/ X
- ]: U0 m: D+ ?: i// if(enough_data>50){
6 D3 M5 w. i) B y z" T0 z// enoughDataFlag=0x01;; B, O$ U8 G. y4 E
// }else if(enough_data<50){
$ J! V1 J/ z) B* n- `) J// enoughDataFlag=0x00;//0x00还是不行3 Y# o8 d/ N+ i3 H+ M/ \' a2 @
// }! \9 t( b5 l' g/ x
7 i: {' @4 Z0 V* M1 `8 u
$ d; i* S% s4 s3 @& M- U oo=10;
7 K) S, c% A; H9 H5 S oo = oo < 5;+ x* |# ^4 J6 M5 ]- p2 n
if(oo){
' z) O1 M$ w( h% Q) @! [ ii=0;2 n# l% `' K7 D8 q2 ?3 N! f4 P
}
O& R: ], x, @0 g. J8 J if(oo < 5){: i* Y' V* L, e7 R2 R' n
ii=0;' r7 Y4 z4 h& |) {+ o
}
( y4 d3 S# z7 X. g/ b$ T if(oo > 5){) x9 k/ F1 b$ |1 D/ F+ z- d2 i
ii=0;; T9 t' @) s% O5 s
}
% G3 i8 U0 @$ c; y; e& F
! _, P8 v! B4 H1 Y4 M7 i /* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */2 _4 {3 W4 f+ c# K
/* 如果数据足够才执行主程序 */- g6 ~! {$ G$ d$ X% Y! F: ` c
oo = oo < 5;, y" V/ F# K* X
enoughDataFlag = enoughDataFlag < 5;6 ?9 s- a9 F& c* I
if (enoughDataFlag < 5) {
7 |0 Z* y0 L/ G+ Z, R// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0) K5 i m4 o' w/ e3 \. R
AGC_AGC(&pAGC);
, A9 P J# K8 C9 @! o i3 k! ]* n7 {8 p
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
) T/ [! h1 m- m7 ]8 P FIRDecimator_FIRDecimator(&pRxFilter);5 Q/ n/ g' N# u- a3 L; a& H
2 M) i& a7 y: ~6 G/ m
/* Downsampling */
2 B( b7 e- T! Y7 t s$ v c_SymbolSynchronizer_SymbolSync(&pTimingRec);
4 {& z6 Q' o6 ^! E3 {; x" H# w# G6 {- r+ a
c_PreambleDetector_PreambleDete(&pPrbDet);3 K$ j# K/ a% y: j
0 p6 r/ e: a" [8 `# A
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
) z7 Q; F$ n8 S8 d: N; d5 B: q /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */) ]/ z& g% B* K) r0 l. H
/* %帧数量=100 */
/ L( u) J5 i; k: h3 ?# \ pFrameSync.isInitialized = 0;! J% u8 G$ Q# G6 H$ s
# d6 X8 S4 w8 s' m: ~
/* [EOF] */, {/ c- K7 X8 t0 G+ X
/* 前导码长度是13 */ B" Y, _1 p' [
/* %qpsk */
% A3 T# k8 h5 L8 c8 { a pDataDecod.isInitialized = 0;6 l% ^2 D/ C- T. N$ O; h
* N# M! W% w* ^6 b3 n
/* end */1 q8 N6 u5 d8 [1 G# H
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */% j# j# O. W3 x- Z8 T9 O5 B4 o' P3 x
/* Convert 3-dB frequency */5 F \% n6 W# ?9 p" M( r2 y6 l0 j! b
/* Convert 3-dB frequency */6 w: g+ p. p6 p, c) `
filtfilt(save_buffer, usable_left_filtfilt);6 y7 `$ p7 w% C! A, g/ j
for (ixstart = 0; ixstart < 81000; ixstart++) {
0 o3 d, i( L9 G4 \# c usable_left_filtfilt[ixstart] *= 2.0;4 F7 W6 x9 X, m0 R
}. B) Q' B6 f1 z% x
' V' I% u! ]' o
/* 注意乘2,处理幅度 */( g+ ^% Q) {1 t1 q5 @; D
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */
+ @: b" Z! Q6 ^& R7 } w3 H /* %% 行列转换 */
% _* ~6 e2 N5 r' ?: q/ B; i; d yiDuanShuJu_mean = b_mean(usable_left_filtfilt);7 z; N4 o/ b5 B/ x( l8 c2 Y0 g
for (ixstart = 0; ixstart < 81000; ixstart++) {" J x; S, G3 @
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
@ r$ E3 K" b) @3 w - yiDuanShuJu_mean;
: C7 |! V8 X& e' t1 T7 K2 v }
* v4 G( b5 N9 w% ?" O5 Q( j' l7 z
/* %% 应该对数据归一化,但是这一步放在哪比较好 */
0 b- F# Y! _4 ^/ H ixstart = 1;
Z. }( J o6 Y2 i6 |$ d8 S3 b& O mtmp = youXiaoShuJu_QuZhiLiu[0];
6 X: _+ h1 W' D6 ^: T# \ E if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {% e3 y8 ^5 C% \7 ?$ x
ix = 2;
4 P! c7 Z. l' a6 h$ D7 e exitg2 = false;
% L2 ?7 u: n; J. P while ((!exitg2) && (ix < 81001)) {
+ C$ g; ]7 T( f* C8 P3 M( t( }) q ixstart = ix;
$ ^; h% V" T. v& q2 v/ Z if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {0 P0 s% u; `1 q+ _; S' ]
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];+ x) A% I- D9 o9 F$ @6 m$ Y
exitg2 = true;
: u" z- Q1 ?2 n+ c% E } else {
; c* x0 ^7 i o& U9 O ix++;( _1 f( M6 R0 D! T' D7 t R
}
, |, }& G5 T7 u4 u" Z }8 p" ]" \5 o6 O2 L
}
6 S- d1 [* v, S8 h' @ e( u, E- N' U2 h! J$ _9 W6 x
if (ixstart < 81000) {
3 E1 ?- K" h" \# l3 B- ~1 C while (ixstart + 1 < 81001) {! `2 j( A: n4 H6 ^& U" |/ G. R
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
( V9 d8 b& E( x- r+ ~ mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
7 z; ^/ K+ [) b; V6 \- R$ g }) C1 s' Y' F8 m0 ^- U" U9 ]
: E) n' ~4 J3 P+ ]" o W Q: ~, S" n) v ixstart++;
! x f* X# r9 y2 K( ` }
" x2 s& d8 M8 v) O, f- \, E) H }
9 E$ N$ v; ] S, n1 o/ M8 d# R: I' g+ v# O4 C; M7 s
ixstart = 1;, y% \( a% s7 g; Z0 M
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
/ `' f2 @$ a( ]+ X) p8 ] if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {* I" s4 |0 h3 B
ix = 2;0 ^( \$ w- g% r) H
exitg1 = false;
- Y9 c) Q3 [) k. g) L while ((!exitg1) && (ix < 81001)) {
. L6 r$ j" F( o* u7 F" c9 u/ H ixstart = ix;; }3 Q5 w+ y6 L9 Y
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
7 a7 p6 X' g) y9 ? yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];# p# ]" g; s2 ]1 {9 Q
exitg1 = true;
) m9 K8 v7 G+ L7 X } else {
$ ]+ K) I' [# K- z ix++;' x2 m" P0 I) ^8 z* r
}' h. J. q, F4 a: R. n
}* S) @4 Q1 p$ e3 I6 v- U
}! q7 L# t3 X: U* `7 |2 v8 o
; W! b* v. F: i( E/ J- J3 x! m- L if (ixstart < 81000) {
7 `/ c9 S$ k% V# n: n! _0 x, e while (ixstart + 1 < 81001) {* U4 r1 L3 q+ e N E: d/ I+ {
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
, Z( ^$ x0 j, }: Z" X6 Y yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
6 s& S9 z; I. R7 n" R2 l }" V* f& t8 N+ \8 E0 M
# w9 J- i) N$ i; n" N& a
ixstart++;3 W v7 U3 ~: D9 @9 D
}" X8 {- O% i, D9 n
}
& e( [0 P3 q# q& A. Q6 N
5 a+ j' z0 x8 K1 ~+ V yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);1 L- y% p3 i7 O: m* Y
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {9 Q) H2 {+ v0 u% F& A6 \2 M
yiDuanShuJu_mean = mtmp;
; E" w6 W/ \# S: F2 g7 X+ X }
k+ [' f' ~" ?5 F" T+ R' ~0 b" I
) ~. o" g4 b- X1 B+ q /* 找出极值 */
9 x1 W1 H7 d" L* H8 ] for (ixstart = 0; ixstart < 81000; ixstart++) {. ]1 |* t5 d( U `% ]$ H. h6 m* f
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;/ a. Z% k1 M, K% P- h
}! s* ^5 o% n' g1 D
8 R& N& W. v) H) O* a" d1 R5 u --------------帖子字数限制------------------
5 _6 O/ ?: U2 B: ~6 k}* M- ?/ V8 D# e5 x: w/ B; G
" w5 y: {! |$ I/ G8 E
4 {' n# T9 Q, ?8 }4 r: m: U4 c |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|