|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
, {2 L% b0 Q1 G5 ?) l
$ A5 D, C6 C6 ]' N4 v2 }各位大神:
! X- D l9 _' v5 y9 g/ ` 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)/ `5 n9 d& ?6 @/ t# W
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
3 k$ a1 m3 w2 S5 u. a! K# R/ _7 i- r+ E* U H
% l( j' _" A; F! @/ Q7 S$ D
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。( F6 Y0 W) y/ f5 i4 v3 G
* G# B6 Y, w0 A7 g3 ~
并没有其他线程
+ }4 U8 S8 G% P反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。/ J- Z7 j/ a& U7 w
也说不定是和堆栈有关系。。。。。。
. h' i' T; }: Q2 \; {/ K" ^请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
8 a( [4 x r7 A L( X$ X8 m9 v9 b a% r. u
B) S( o; q( R7 l( A9 f1 W" C& S( b! ?0 N! L) I
我也很绝望啊,希望大神能帮帮忙,感激不尽,!
5 U1 h3 T9 v( |( y! _1 J
- b: U' K1 i# A8 ^$ D6 f$ {
$ F4 \9 ]' C: Y! P4 {附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];7 h/ _ [; v2 f$ m( h/ C
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
! C' T! [$ F$ B0 \6 [
% v* Y1 ?5 t/ L! G1 ?boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(" m9 P) s( _( f' ?' T6 n
const double data1000[1000]) {
8 |7 b8 x9 v9 X! l5 f7 l' B$ u5 T7 N- B7 ~
int myfuck;
4 |5 K/ c: D, N6 ]' ^8 m double yiDuanShuJu_mean;
" i6 p/ m4 d; U- z3 b double yiDuanShuJu_LowMean[1000];. h9 k9 F0 Y# }
int ixstart;
; b9 y, i3 t! p double dv0[1000];
5 K+ @' G D3 u: l comm_AGC pAGC;
( _+ |0 l7 h% Z' ~ comm_CarrierSynchronizer pFineFreqCompensator;5 @! K0 A5 l8 r' ~- k' N4 I) t
dspcodegen_FIRDecimator pRxFilter;6 t" e" m" @( M* y6 w) e/ X s! H6 g. y
comm_SymbolSynchronizer pTimingRec;( K' X* @. ]1 Q$ n6 @4 R4 R
comm_PreambleDetector pPrbDet;
* |5 w0 u. s% W3 x9 } FrameSynchronizer pFrameSync;
( @! s- B% g2 _5 ~ z1 c QPSKDataDecoder pDataDecod;
' o/ c. i( p0 B* ]9 E static double usable_left_filtfilt[81000];
0 D6 y( ^3 H1 t7 ]( M/ h static double youXiaoShuJu_QuZhiLiu[81000];
' l2 @( X, S( M! G, \/ @ double mtmp;8 }4 |0 B3 y' m% e- H! g: R3 T
int ix;6 O/ R# x5 e8 v. o# b5 J
boolean_T exitg2;9 S/ c$ @* x. U' _
boolean_T exitg1;9 y: u$ j4 j7 Q
double YiZhenShuJu[800];+ f2 r! C4 w+ \3 v1 | t
double dv1[800];
9 [: D! S3 {& B' ~/ s! W# j! ^' G7 K9 u A
- z# H) o% _- `7 h double b_YiZhenShuJu[800];
# N' o! M9 @( i5 L2 y$ o double I_filtfilt[800];
. \; Y) ?5 C% v double Q_filtfilt[800];6 T: \' L0 Q( q9 B; J) k
creal_T b_I_filtfilt[800];. H: O) `9 D6 l
creal_T b[800];
* Y5 x) q7 M: h creal_T RCRxSignal[50];
+ z% n. |7 @- i1 V$ W* c) R creal_T fineCompSignal[50];! H, b/ v7 H$ b6 [5 p- F( `
double phError[50];
9 t0 S% I% h0 J/ \, R. o# \ creal_T timingRecSignal_data[28];, R4 ^" ]6 ~2 ~+ j1 n/ I$ _* B& p
int timingRecSignal_size[1];- k. D& U0 ?7 f( y& B
double prbIdx_data[28];
* j/ L! R7 [# g int prbIdx_size[1];
# r% s0 W$ }! N g' I double dtMt_data[28];$ z/ H$ C9 ~& o4 ]% x2 t+ L
int dtMt_size[1];5 [8 G7 a: A3 ]5 n/ W
creal_T symFrame[25];% J- g0 u. G* a' S
boolean_T isFrameValid;# T2 f: Z' f3 ~
double unusedU0[3];
8 H* m6 E/ W V) d8 j- D& P d( y" N* H; a! i3 V' W; N- x
//调试过程中的变量
* z9 r: J3 |; }' ~+ r$ `& x int enough_data;
% B( H& s; P0 d8 T; _6 O% X/ c. Y- }$ P- c, E% L
int enoughDataFlag;
) d# q- ]) u% W" p; B int yiDuanShuJu_mean_int;
: f7 ^- B% O; n0 I int int_sum_dv0;% p+ {2 n+ M3 v. r
int oo;3 E$ j2 Q, q$ F* J
int ii;
" b1 d3 O4 y4 j3 x1 U. ` myfuck=10;
9 y* _& _; |% v* h( Z7 H7 c /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
0 v" A2 @; f5 b2 U' w /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
, |$ C) l) ?" ~% w* }0 h H% C' z' c6 l" U6 s
yiDuanShuJu_mean = mean(data1000);6 [7 q6 \6 G6 B; `8 `7 E
: L8 t w- j# u& G# j+ ~) k5 a yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;$ r: Y7 |; E+ c4 b. x: W8 e# E
UARTPutc('A');
* K& V6 Y, m8 q& D/ ^1 d* V UARTPutNum(yiDuanShuJu_mean_int);
/ L5 p: o6 W/ W7 p9 w y" r& Y* L UARTPutc('\r');
% Z- a4 l# M" j! Z( I X" `% _ UARTPutc('\n');) |3 l2 s, D; N3 {+ r3 w
7 V! u W4 f$ D* q: A; U for (ixstart = 0; ixstart < 1000; ixstart++) {
- T' Y/ ~$ s) m# ]+ |8 d: M* n yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
, o! T+ V# {: N+ l) W }6 |+ Z" i0 }5 n4 Z1 g3 z2 _
5 r5 w2 a, \; @: [" H4 q5 z% y power(yiDuanShuJu_LowMean, dv0);9 K$ a G* G6 t# i% b$ w
- m" W1 T! r a6 P
int_sum_dv0 = (int) sum(dv0);9 I N, |3 {7 b
1 h6 r8 C4 t/ z: m: T! H& N UARTPutc('B');
6 X7 r- |! I! |1 V) u# F( N8 s UARTPutNum(int_sum_dv0);
8 m- S( C" k' I4 Q. E) |7 u UARTPutc('\r');/ p/ _3 M4 j0 w- e: O; p
UARTPutc('\n');
1 Z: I( C' }" a, v0 ~
1 F5 H+ W+ G5 v# q// int compareFlag = int_sum_dv0 > 1.0E+8;# E7 D' ?' l! v i% w c* i, O
6 I' ]4 `4 v* z& D/ K, ]0 I: V
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
* V. ~/ w" }$ g7 {3 D UARTPutc('C');
, l( x# k& @8 {' F /* 比较信号能量 */
" x' E$ p( F8 T5 ]* U /* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */; e$ N0 B. c& c
// yiDuanShuJu_mean = 1000.0 * youxiao_k;3 L" r/ D( e& ~7 N3 t' R. n8 A
// for (ixstart = 0; ixstart < 1000; ixstart++) {
* j9 R" C9 u$ n% h// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
: o; x B( s/ X/ i0 b9 X, i// yiDuanShuJu_LowMean[ixstart];
4 \- m5 K z+ q" g7 X' x// }
: d' G+ _( l* v1 }//
( I' z- @" w9 S# T// youxiao_k++;$ V6 Y! L+ }( B" Q5 s o
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
& `+ {8 |7 i7 j// /* 感觉要取21个数,即0-20, */
9 x6 E7 e; t" K: K, r// enough_data = 10;//有效是10,无效是0
2 O9 { z3 T; y7 [// }
4 {. S z r+ S+ n% X0 u7 o8 Y5 N* D }! _ u8 v0 D- A |# S+ _! X
* E; x( _5 k6 D. [; @0 `& W- F
- u+ w9 c) x0 E+ G enoughDataFlag = 100;
. @ M, r" _- i' _/ M& o enoughDataFlag = 1000;3 R( A: {' S8 }; J3 i& E% t! @
enoughDataFlag = 0x02;
8 ]& G4 K: G* z+ C6 K6 m enoughDataFlag = 200;
' Q$ r8 @, U, c) f5 k! \2 p2 E1 D5 Q) q1 f$ |% t. U! e
int myfuvk1;" R! o1 v* O8 w" G
myfuvk1 =11;
( ?1 J+ M* \6 F& h$ c: o/ w
8 X' f0 x6 i& J3 D, U& E3 Y( B
0 u! N8 Z- D- ]; \3 [7 P" L( {7 c enough_data = 0;8 k5 v8 R; C, ? S! o8 `* V; a8 k+ \
M! G- x+ L# d
// if(enough_data>50){
{+ ]! n% S P' I// enoughDataFlag=0x01;1 D% t$ G& z ]7 s ?, o
// }else if(enough_data<50){
z) ]) C* ^* F// enoughDataFlag=0x00;//0x00还是不行
, q Z! p0 X; \! R// }6 {7 _, o; E, P
( J7 g8 O1 D0 q, l" o; a6 L; U3 Y/ }! c0 M
oo=10;8 G, S$ I8 J: C6 h
oo = oo < 5;
$ F) q2 O, P v8 [ if(oo){) L* Y- z) o K& M7 m$ h
ii=0;
8 u, a' W$ L+ M j# I( L }1 @7 m$ f' ~2 U3 B+ k) I- W
if(oo < 5){. J; @6 G# o1 g) I' D' L+ u& y5 b
ii=0;
3 `3 d# e# u* [) i) G n0 V. n" z! l! Y }
# I+ g! d1 y# d( z t if(oo > 5){
a/ ~3 g) x5 o ii=0;
8 A9 l" @8 [ u: T+ e4 ]+ O( P* H0 e }
$ U4 a4 y0 u- B( m; c J2 d! k
# Q7 a1 ^# m, w; p. |$ ] /* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */9 _1 Q, }# f# O
/* 如果数据足够才执行主程序 */1 a) a4 Z# D4 G) Y. B1 [
oo = oo < 5;0 ~- _% R9 b2 K4 E9 z! [
enoughDataFlag = enoughDataFlag < 5;& W+ n3 L+ h) z+ t& T; L
if (enoughDataFlag < 5) {
; m% q. T. T* a1 i/ U0 V7 i// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
1 m6 |% r9 @% d1 i% R+ c' }; R7 d7 _7 M AGC_AGC(&pAGC);
! w. \8 Z' s8 o4 o; W( w/ t& z6 F- ~6 i& a8 o! l' u1 Z
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);3 d2 S7 A1 X$ z. n
FIRDecimator_FIRDecimator(&pRxFilter);
% c' [1 B* R! ?5 h' V/ W- V+ ^9 K# {# j+ v ]
/* Downsampling */; C' ]8 s5 _* w7 b' h* Q- m( C
c_SymbolSynchronizer_SymbolSync(&pTimingRec);6 B8 ~8 i/ ~$ s( @: o' d8 t. k
, B3 T- v+ {8 B6 D& y6 H1 }( `4 J c_PreambleDetector_PreambleDete(&pPrbDet);
7 Z+ A3 f+ \# b8 _. |4 u& V ~. U% f6 Q* B6 ?) V. g: i
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */! w& p5 j) v- j9 _
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */7 {& g9 W# m" u) e
/* %帧数量=100 */0 u; c9 _% ]2 a0 J! i/ J8 Q+ F
pFrameSync.isInitialized = 0;
/ v, c8 I7 v& S# n1 B1 z, ]9 _1 O" Y/ y8 |5 W& U+ I3 k
/* [EOF] */
, L& U5 N3 v6 z# i /* 前导码长度是13 */
+ C0 f- N" _4 k' U+ M# h /* %qpsk */1 c3 {8 g4 q& I9 w( p
pDataDecod.isInitialized = 0;
% m. X4 w# K) v/ Y9 O
+ [& p+ [& P1 r! v. a- N /* end */
9 i4 F9 t$ R% @7 n) P /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
3 ]( f ^) ^0 D3 b4 N$ H /* Convert 3-dB frequency */, |- C! t2 O1 o# W
/* Convert 3-dB frequency */* y: X5 B- k" k" o
filtfilt(save_buffer, usable_left_filtfilt);, \9 @+ U* D$ a6 y- g% V
for (ixstart = 0; ixstart < 81000; ixstart++) {. \% s* N3 v6 w0 d9 K7 O7 R
usable_left_filtfilt[ixstart] *= 2.0;
B+ N) n( U9 z& G/ [ }+ w/ s4 X# j# [; u5 F$ f$ Q
8 x! B# w) _# n
/* 注意乘2,处理幅度 */9 G) ` f I; G$ a0 x
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */
1 ?6 S4 O8 \0 u/ [) D% b0 |7 H1 z% a /* %% 行列转换 */
' X- K0 f9 h5 W0 V8 o& T) K yiDuanShuJu_mean = b_mean(usable_left_filtfilt);. C( J8 _8 j& B3 D: z6 n
for (ixstart = 0; ixstart < 81000; ixstart++) {0 F) I- Z/ A8 e6 E, @& Z. p
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]0 [! X" n. {- J. Z8 W! g
- yiDuanShuJu_mean;
0 z1 V0 `$ R0 Z& s0 X$ @: _" A }
+ y5 Q7 s" u* q* U1 j8 ^; c: }& q/ Q( }* t5 M
/* %% 应该对数据归一化,但是这一步放在哪比较好 */: a4 F6 y7 O! c. K
ixstart = 1;
6 i" C% p* I, _6 ~! X mtmp = youXiaoShuJu_QuZhiLiu[0];' U4 m$ ]- ^- P) p% E e
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
3 Z1 a1 j+ w# t3 m; G( I0 J1 `. L ix = 2;
2 I2 F! _( Y' H: u exitg2 = false;
9 x8 B) D c2 {% o while ((!exitg2) && (ix < 81001)) {
0 U* Y' i4 F4 [8 Q" u# g$ J0 L ixstart = ix;
4 W% K4 p2 u( @* n8 N; E6 t6 R if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {% \* |$ o- I! T8 d3 N) U" H
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];- B$ ^+ Z b/ h' H8 o5 c6 O7 y
exitg2 = true;
3 p) J2 x- z! X) g7 }3 C: ]; u } else {" U, U+ y* y1 d1 Z0 {3 r' V4 Y& j% r, |
ix++;" V* j1 H3 h0 e5 ?
}
) v3 E0 {% a$ y! w }
6 Z) R: B. }; o" V }+ s9 h7 m9 a G! x) o9 _- [0 L
8 C5 @7 J9 I; C* P: v
if (ixstart < 81000) {
, y- p9 W% _+ f" [6 h while (ixstart + 1 < 81001) {* i- L1 }6 b' g* [3 |
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
7 f4 c" ?1 C9 c( O mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
+ }/ ^! l% u" Z& y }! d+ ?' Q3 D7 i c( X
7 W0 o4 \/ ~- ]8 F3 c1 j6 W4 T" u( m ixstart++;9 Z+ ~! a4 N- V8 K
}
. v; k. |9 c7 w" K' l. S }' y3 M& `, \; i. X; @8 K
- m" r6 X R5 D T( n$ y' k9 a ixstart = 1;; T; [5 n, t0 E" K! q, l
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
! b2 h2 D( J: o$ i- h' T7 m if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
5 }8 N* F% R8 V/ h ix = 2;1 s& h: r0 B1 J8 M$ N. X2 X
exitg1 = false;
8 C5 {; g- `- \3 c while ((!exitg1) && (ix < 81001)) {% C6 Q: C8 ~( x* x& X7 f( ?
ixstart = ix;
' } J9 s X! f6 ?% N if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {* h& b" Y/ G! q% `! E, E2 }
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
# {5 _0 c: i' b0 J exitg1 = true;
0 `0 Q2 ^" I9 |2 T! } } else {
5 n& }9 S5 n) _ ix++;/ v% ]- M2 R+ _& Q! c1 A
}0 y0 R! }, q0 _0 l+ k# a1 ]! X
}( H" o4 l! n& P) B& M
}
5 D! m2 |: ~, O: r: i$ b
: Z& i7 g1 n q( ^/ S, a k if (ixstart < 81000) {# X" i0 [8 {: v: }' S# h7 g
while (ixstart + 1 < 81001) {
3 Z6 B1 w$ c3 P1 T, s if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {" W* |1 Z! I+ m1 B2 M
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
- b& E8 f9 ?8 \ ` }
% H- P0 P8 _5 {: c+ ]+ t2 \
9 q% h0 m- w$ i7 v ixstart++;
0 J- Q7 E; j* R5 E6 k m) A }
3 e3 j5 t1 M t8 J+ k }/ C" V2 z& H+ `4 l
4 j! r1 m3 |2 A0 h5 q: a
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);( s8 Q( A: J$ k# F7 L+ R# E
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {8 N0 P0 U v1 l
yiDuanShuJu_mean = mtmp;( V' X1 ~6 l% |/ R- ~- A" y& f
}
4 Y! m5 P0 v5 _# A& L* Y2 L- I- P' d2 K1 B: h$ O4 Y' J
/* 找出极值 */
! x" [0 }* t6 `- f for (ixstart = 0; ixstart < 81000; ixstart++) {
4 }$ i7 f$ }. F' a& S4 ~# | youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;8 e s1 c+ o' H# g
}% ]/ W: K0 {: X+ H9 @
! @* r# ]8 S4 p+ {) a
--------------帖子字数限制------------------! M4 m' e7 l Y
}
* F; S( x6 p' E$ D" ?
# [ ~) _1 _ b7 G$ R4 w6 ]* S8 H: f: ~, z0 y+ M/ t- n. H8 R
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|