|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 / w0 z2 P) Q$ t9 s
; W" O! V/ n) t% ?* C各位大神:! ?9 U. V0 m* d9 d) ~9 \
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
, A3 |% v8 w; ^* E 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:; T2 y$ ~ M) A
6 h7 D0 ~/ {( L3 v4 d, j0 n9 B" N# C
5 W- ^9 z# T" G1 E3 T这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。" C. q5 g' v+ G4 s4 z) X/ S
5 Z8 O |: |6 y: B: ?% ?* s
并没有其他线程
# N. _5 W. t0 s2 r. q反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。7 y3 D/ }$ C! ]& e: @$ `! S& X& v
也说不定是和堆栈有关系。。。。。。 V3 f0 u" a7 g, U
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
/ U0 a2 T" G- U& f* d( D* h7 R/ t0 d. x% }4 S
) f" G: }4 ~0 g" n1 g. i: x7 U* \
7 i4 p% e4 Z4 C. y" \9 F我也很绝望啊,希望大神能帮帮忙,感激不尽,!
5 | w! k ]) r0 k, _2 t; E) g" o+ d2 i F9 a8 ?( P, U! P0 h: l
* R% |' M' m) O9 [% n1 f! p+ d附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000]; ^# E3 A' [- M( r# ^
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
8 f$ P/ ~ m4 o9 r# R8 A3 Z/ z6 E. X2 w: Z
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC( |, u- C" i( F7 g+ X
const double data1000[1000]) {
0 k" `+ E) v7 n) y- f
2 x6 r' I5 B5 A int myfuck;* ~9 j" i$ D$ X* i* h
double yiDuanShuJu_mean;
4 P/ P }& C5 S" C' C double yiDuanShuJu_LowMean[1000];
& r5 \ w' e2 ~, Q/ q1 S int ixstart;5 O. b4 F3 l6 A- L2 t
double dv0[1000];* ?5 x& \# v7 z: f% L% g6 U6 M
comm_AGC pAGC;
% i- K% U/ ~7 ?2 |8 k. p% w comm_CarrierSynchronizer pFineFreqCompensator;. H) _8 x: E: V# @$ B
dspcodegen_FIRDecimator pRxFilter;' d/ v( `/ U Q/ f% t" X5 r; O+ O
comm_SymbolSynchronizer pTimingRec;, E% U8 z% P! v1 N" \
comm_PreambleDetector pPrbDet;
/ I, k# [8 e9 |$ {, n& K; w FrameSynchronizer pFrameSync;
/ U$ D' f! Z. R! c QPSKDataDecoder pDataDecod;2 j5 a, x, L, a
static double usable_left_filtfilt[81000];% L, D% ^. p. c" F( ]0 h1 @
static double youXiaoShuJu_QuZhiLiu[81000];
9 h, x: A r( y/ i double mtmp;5 w. w5 I6 M4 K1 R8 B& v
int ix;3 Z& v/ }5 [0 m- |2 @! k
boolean_T exitg2;
3 }7 g; @% G9 ^6 q9 N9 A boolean_T exitg1;+ M3 Y/ U7 B- h) Z2 M
double YiZhenShuJu[800];& R% R: ]& a3 y& b. g2 B
double dv1[800];
5 j/ U! I) [0 l3 Z9 L
j9 H1 D. y0 n6 o3 [7 F
4 o& w- P5 Q+ O6 y" a# n" Z, S2 q double b_YiZhenShuJu[800];& o6 l" q6 N3 f ^1 ^" I H: B
double I_filtfilt[800];
4 D' U& `* W1 n. N4 y! y% z double Q_filtfilt[800];8 T+ f' G. W" }1 ~5 x
creal_T b_I_filtfilt[800];
9 K2 ]" P) A6 G1 { creal_T b[800]; Q' p0 h- Y. Q0 W. N
creal_T RCRxSignal[50];" E- e! T9 X5 m' S
creal_T fineCompSignal[50];5 A! p* H- w2 D5 Y* h" V( z
double phError[50];: s# f7 O- N: u4 M
creal_T timingRecSignal_data[28];/ M3 R* {: C- s. ?; b6 E0 o
int timingRecSignal_size[1];
' @( |4 G( o2 m double prbIdx_data[28];
) B# v8 o% P. P! T- d8 S2 y int prbIdx_size[1];; ^- X' B! F. W0 @6 O d
double dtMt_data[28];
p/ ?6 \# O; l0 B `' o( O int dtMt_size[1];. P: i) X; O z) c1 k
creal_T symFrame[25];7 h2 H2 |$ c( ?: J
boolean_T isFrameValid;
. x3 M/ c% w8 r! G' X7 v( d% q) T double unusedU0[3];* G1 f, K) h ~8 f$ H5 \
- P7 E& G, q, G* m$ d% b, i* c/ b //调试过程中的变量
3 @$ I6 e& Z0 N" E int enough_data;4 b7 V) ~0 e' C0 e
4 y# [! N* @3 u3 v6 w w- j, }7 i
int enoughDataFlag;0 l' z4 y! s/ f, x
int yiDuanShuJu_mean_int;6 n- [8 n$ N* M- q/ ?1 c7 ?. [
int int_sum_dv0; W' x4 ^1 U( x
int oo;' B3 U+ t- p7 D$ L
int ii;
5 K B: X- }- s2 S, \0 A. P2 j myfuck=10;- g/ y7 o. F. J! R5 j2 h/ r
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */8 l+ W# f) g% J$ y3 P; O
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */3 {. }6 X" a7 n- N: Q3 x
& s0 s6 k# R$ X5 i$ m2 Z) U yiDuanShuJu_mean = mean(data1000);
5 S: }# ]+ W" o. B/ R5 s }7 v0 |9 K( o& \+ D* K
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;/ \- Y+ p/ ?# F: t1 k# X
UARTPutc('A');. M: a( Q9 F5 ?7 ^# D" u
UARTPutNum(yiDuanShuJu_mean_int);3 v& c6 a& T" G- |
UARTPutc('\r');
4 l+ c' M5 F5 i) _5 s UARTPutc('\n');
" O5 Y0 `6 x4 H: r! a/ m: s) H9 G! u+ T; \# j( o7 t0 z
for (ixstart = 0; ixstart < 1000; ixstart++) {' Y! X, ] o! u! l
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
; v' H1 u& I% Q3 f }3 d d0 w( w" m$ ~. A j
8 v- P+ ^2 K" Z" o2 E! f" K0 z
power(yiDuanShuJu_LowMean, dv0);
6 H+ i7 z! Z) K+ G: w$ A6 }0 y6 Y( d6 `& [9 ~
int_sum_dv0 = (int) sum(dv0);
1 h2 |, x7 e/ n0 y) V! i( }: K
" M3 d4 G4 ?5 \6 K$ S UARTPutc('B');
4 \8 n% ]' Q& d8 J3 `5 _ UARTPutNum(int_sum_dv0);
[5 X1 u) O! |' s M+ i. Y UARTPutc('\r');: h( Z1 i6 {9 ^) H8 ?8 p7 q- Q6 T
UARTPutc('\n');6 A4 e8 _, J4 a; b, }" Z p* N
8 q2 }9 X$ K! O# R
// int compareFlag = int_sum_dv0 > 1.0E+8;2 O1 N# R3 y/ g5 Q" y0 k
3 k/ V2 T" m* y* |9 D if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?" i! }3 @+ f( K: D3 i) n/ v6 A6 x! [
UARTPutc('C');1 Q% C V) j! a8 Z6 N$ I
/* 比较信号能量 */: x6 {* A3 Z* \- q5 ~
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */7 u( l7 f# f% x5 ]4 r" n9 I
// yiDuanShuJu_mean = 1000.0 * youxiao_k;
. |' u( M+ d3 D* S// for (ixstart = 0; ixstart < 1000; ixstart++) {
! L- J8 ?9 n8 k, S; w/ e( R `// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =/ \1 s) c$ i7 c; A
// yiDuanShuJu_LowMean[ixstart];
$ D; u& E- d# W' Y2 }7 S& ^$ G, E// }( P- S" K& f1 }3 C3 S7 @
//
7 `+ E _5 p0 c; C: K; E+ W// youxiao_k++;
0 m9 {5 U1 W) S- B! N, u// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==# X8 h6 Y9 n6 B5 g' b5 L2 s6 s& U& D
// /* 感觉要取21个数,即0-20, */
( q0 k* T0 W3 V// enough_data = 10;//有效是10,无效是0" `; }/ S s8 P: d9 j# H! a6 w) ?
// }
2 t0 j# ^) P) z5 C. ~7 r3 O( t }
" C# }* W2 F }. K( X+ R& O. x2 n7 S$ }+ S5 F# ^: b9 O, x8 G
, K; d" V. _% ~1 n4 q3 S
enoughDataFlag = 100;+ P$ h; B* Q% [' v% P: j; r, N
enoughDataFlag = 1000;
! f2 L4 y, F8 O enoughDataFlag = 0x02;! s; Y% {& }$ L3 Y7 Z* G/ X
enoughDataFlag = 200; d7 \+ [1 `- @3 q& k' H) W5 _
% q m/ y3 T* U int myfuvk1;3 }# ~- Y4 W7 I ?& d% L" L& G; V
myfuvk1 =11;
- K1 n8 y. F. e% Q$ t/ K& o& ~2 C7 n, N
# l/ y3 p" t, j) a5 T) m
enough_data = 0;. |5 n0 c3 ^6 b1 X1 g+ N% r- I) m
: A/ Y+ }7 s( v/ i5 ~3 ?- l
// if(enough_data>50){2 t7 ~& S) U j
// enoughDataFlag=0x01;
* }+ V' K% o! W! N/ ?4 X- Y// }else if(enough_data<50){
- H1 U; j: G* `; R// enoughDataFlag=0x00;//0x00还是不行' e9 V) u3 F/ O4 z
// }
% ]$ |8 ~+ s( Z' e/ I
0 x, \) c! M: l- i
6 u; e6 \2 C% X oo=10;
' G* o) \, i. m: N oo = oo < 5;
. q: o4 o, [7 ]: P# J) T# A if(oo){
2 t/ i' N8 z/ q* k; }6 z ii=0;" p5 k2 `; {- j" P4 v+ h$ @9 ]; s/ d8 z
}
! Q' @8 `% A- G& `. x if(oo < 5){
6 D/ W5 c. G7 V o# u8 b2 i ii=0;
n. d& U8 e& b j4 P+ N }( T+ r6 C! B. x2 H. F
if(oo > 5){
2 m) ^9 X2 K5 @3 D' y ii=0;
4 {6 Q( L3 D4 y }
6 l a5 C* @0 K+ h3 q7 r/ L& i+ @0 @4 m6 P1 `
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
( ^5 r% A& J) q4 J( Q5 O /* 如果数据足够才执行主程序 */2 G$ u D" k8 y# v! z. M
oo = oo < 5;
+ _# ^5 e& P1 A; B enoughDataFlag = enoughDataFlag < 5;" L. R3 D+ c7 }1 L1 h3 u
if (enoughDataFlag < 5) {9 F2 ~* B8 m, E$ C
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是07 I9 i$ e: {0 |. q- V. }% l, d
AGC_AGC(&pAGC);
' k: g: j% Y* B0 U" k) l$ U v! K9 y1 D4 ` |0 F. ]
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
- d7 W$ E. P( W; _8 R" Z9 W3 ` FIRDecimator_FIRDecimator(&pRxFilter);
; X6 O: t' y N! p3 f" g: s/ m; k$ U+ x. x6 }
/* Downsampling */
0 z" F, Y# K2 H1 F: q c_SymbolSynchronizer_SymbolSync(&pTimingRec);9 t* s% A2 E! |
% a/ A! Z% H' w9 m# i4 p& Q* c
c_PreambleDetector_PreambleDete(&pPrbDet);
. B9 v) v) I9 s/ j1 X* F _8 a9 ~4 G8 `/ Z
8 {6 t# v$ P V ^' Q /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
; U H( V$ }- N3 E3 k /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
* {: o' l' s% W* X$ ?/ k8 ^# h' w /* %帧数量=100 */
/ {7 Q; y! l0 f( S, O; k( P/ T pFrameSync.isInitialized = 0;5 A9 J$ Y/ l+ s2 o
0 d( ^% ~ l5 W9 d4 S- t
/* [EOF] */. a- b0 r$ h8 U1 Z3 y+ {& d, E! R
/* 前导码长度是13 */$ s5 Q, j; ~' K" S
/* %qpsk */0 Z! o7 G- B1 q8 [! X3 m2 K
pDataDecod.isInitialized = 0;5 W2 r' |0 y7 |5 d# E/ _# f
/ l5 e, z/ d9 F* g /* end */
* e' `* d" t {2 I8 o. Q /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
) i6 a4 a" q- Z; z# q" P. J; x9 E5 g* Y, P /* Convert 3-dB frequency */7 l9 w; e2 r- W' k- q
/* Convert 3-dB frequency */ s$ T6 j) }! N2 M- Y4 B
filtfilt(save_buffer, usable_left_filtfilt);
7 k4 o" L' r: G! [" Z for (ixstart = 0; ixstart < 81000; ixstart++) {
. R: e& [9 [3 @0 K# w usable_left_filtfilt[ixstart] *= 2.0;7 h# k# k0 u% Y+ r2 C
}$ b1 p, }6 }- \
7 O' U; R! L }7 Z0 G, U7 Y
/* 注意乘2,处理幅度 */; V0 n6 V) |7 v4 d
/* %% 我发现带通之后其实就均值为0了,不用这一步了 *// o$ e P) v* P( M8 @% i
/* %% 行列转换 */9 Y$ ?& O M9 |( e6 U8 r2 `+ s
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
) g) Y% @: F) U3 [9 n% D) z% p for (ixstart = 0; ixstart < 81000; ixstart++) {
$ l8 ?$ P0 A4 }& c1 u youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
9 P) F: H0 M% H9 @% F9 _ - yiDuanShuJu_mean;
# e' ?- ?! F& w, L }* O' P6 ^& b; c, p# J. W2 O
. V: |0 L2 E/ m, I/ A4 m
/* %% 应该对数据归一化,但是这一步放在哪比较好 */
R- t, `8 ~7 V* P4 K" O4 x ixstart = 1;& t" G6 \9 T0 E4 a6 |+ ], ~
mtmp = youXiaoShuJu_QuZhiLiu[0];" @: R0 |% I7 M* ?; w0 t& h: g& [
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) { L$ Z& M7 S7 D# M, u
ix = 2;" |. T# f& ?1 W! s* u; O
exitg2 = false;
% X) F4 e2 N8 i6 C$ n% t7 k while ((!exitg2) && (ix < 81001)) {
4 a. k, n8 L! e ixstart = ix;
; r& X8 i) `* x j1 K" h if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {& `) P) ?$ L. A6 c& G+ U
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
1 }1 m& h' V5 i( T( w exitg2 = true;
. u" s0 B. g( Z! W% X } else {% a. f# d D, l$ n+ n! L# j
ix++;$ f3 T8 ~3 ?% z5 v9 l( B
}
! |( h! M4 U% c7 z7 i# |7 Y }2 I& j* A. a& Z5 w) W( X
}
: s' L( C0 E. s* ~+ k7 [0 T. W" ]+ U4 D' e# T5 M: B: t' V1 [
if (ixstart < 81000) {# ]) t9 _! L7 ^ b- h$ \0 L
while (ixstart + 1 < 81001) {- n' [( \$ I+ h9 O0 A# q
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
3 w; K& i1 ~- |) f mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
, K$ V0 F. u6 @: ^1 o! } }/ N6 Z* e1 @- g, D' j0 E2 A. u
! q3 {/ {! S8 t8 { ixstart++;
* M7 U7 x g0 z8 o; n+ G* [. @ }9 [$ B5 J' E3 p8 _: M6 K1 }' S6 z, o4 B
}* A% W6 w0 N; X' c( b
) e! ]1 c: P: Z' q
ixstart = 1;( ^+ i6 X8 J7 V
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
1 N% x4 ~. i( R5 Q7 u, D2 ? if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {( w: z [) x2 R, |" \$ K& ^6 H9 {
ix = 2;0 w) ?# z5 j9 q0 K4 K/ S# p5 f& ^
exitg1 = false;9 I, T/ A$ _" V# [0 a
while ((!exitg1) && (ix < 81001)) {
* G/ ~7 H8 T$ N* x* ~ ixstart = ix;
! M3 K: E& O! N& [/ o if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
4 R) d2 n) L6 a1 s: t yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];& A$ l4 r- G- l( E- P9 h
exitg1 = true;
/ H+ U" |% \! m# }3 j& U/ T } else {
& P+ j. I) d. |3 _- x2 v4 ] ix++;
. U) V+ q7 c% p+ \ }% o) f+ j, X2 v, k8 r& m: M
}
/ U0 n+ l. X/ o8 ~; ] }
4 C- v1 H9 e4 P* n. Y3 }, `0 o9 j2 W$ {
if (ixstart < 81000) {
+ t/ w E1 F5 g( M: l$ H while (ixstart + 1 < 81001) {' L" `. `8 P0 z$ q
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {# P/ c* h- _1 X) \/ d6 |
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];2 ]! m- ~0 J; ?' ?& X6 m6 G
}" F( J4 b$ [# H+ S7 K
8 F5 v1 Q7 i+ P9 I) M
ixstart++;
3 h7 l: y4 R! ?# U: g! K4 S }, B! d$ P/ {: r6 q1 Z
}' M7 o% e6 @" E8 k, r1 d
% f, z7 V) s. k
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);. E0 ?: o" \) R7 C4 c& Y+ X
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {4 I* b7 \3 D% n( V3 C& [/ G; B
yiDuanShuJu_mean = mtmp;, L5 d2 Z, \; I' D0 m( w1 z
}
0 C4 {. j3 O2 \1 ?' O; c5 g0 c- V- Z" ~" R
/* 找出极值 */
& }# \2 [* k" f' M* Y$ g. q for (ixstart = 0; ixstart < 81000; ixstart++) {
( D9 o. a& e# m; R" J M0 l youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;& ? S$ ?6 N" y
}) ?7 V; T# {, e. i. X/ J
+ Y+ v! G7 U2 B3 U8 ~" c --------------帖子字数限制------------------& q" b% V" c2 u# L: f
}
" R/ Q4 J( ^% j1 c1 ^# i- @6 c! W- x1 b0 I7 T
* N( N. M( N& \ Q; n1 B |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|