|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 ( T- z8 a+ l' W+ l1 C* F
2 g3 ~. z( f6 b各位大神:
' m$ ~* F8 b* E1 }( c 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
( I# R* i4 w. d- ~ I7 [& [/ Z 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:1 T( x- w" A' L- n, _0 {
/ J. d( |3 W! m; `* J" @5 x
: Z. ]- e/ t3 B& ]9 S* W
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
7 J- a& E w% W% _5 Q; k8 x! l6 J" \
并没有其他线程1 p8 B& g4 X- \
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。) I+ j3 D; k# S5 Z% J
也说不定是和堆栈有关系。。。。。。
2 N5 i% a7 j3 @: Y# b. A请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
. D! {1 `2 C2 F7 t$ {# d
0 I+ S/ o' c g! i; j- y
/ W; V; |1 Y1 @- \9 m/ D4 J: F" _0 A& M/ f
我也很绝望啊,希望大神能帮帮忙,感激不尽,!
$ R! o2 @" P! ^0 |' [6 e* T; G, t, S5 k- E! b
$ Q @2 z+ [; B8 Z附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];. U4 _2 \, d; H6 g6 z) ]$ P
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
# G8 g/ ]+ \1 U1 U1 Z$ d6 ~
3 R+ `1 Q/ j6 n/ Bboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(& p% p$ o1 ]5 D& w+ Q8 R
const double data1000[1000]) {
+ v; H3 S" d Y3 p7 K. T8 T$ q/ N' K5 S
int myfuck;
( h: k% j7 A; M) B( x double yiDuanShuJu_mean;
% f! Q3 g9 c% L" ? double yiDuanShuJu_LowMean[1000];
1 h+ L0 \9 f) Y% ^9 r int ixstart;4 d% |& @$ x: i7 }
double dv0[1000];
2 _8 w) X C$ R, ^+ x2 a) T comm_AGC pAGC;' c2 p8 u- q6 D
comm_CarrierSynchronizer pFineFreqCompensator;- t: Q) }9 O D; C7 f
dspcodegen_FIRDecimator pRxFilter;" z4 |; f5 L! q. @* s
comm_SymbolSynchronizer pTimingRec; n; @) @% ?( c2 g; i6 k8 O
comm_PreambleDetector pPrbDet;
/ X( ]+ X( {4 i X1 S9 ]8 n FrameSynchronizer pFrameSync;
- R. w7 |- _4 `' ~+ c* p QPSKDataDecoder pDataDecod;
/ j! C g% V1 `7 f' @ static double usable_left_filtfilt[81000];
0 s. O; l* s6 i& M4 _' x8 h# O static double youXiaoShuJu_QuZhiLiu[81000];
7 T0 f2 q* c5 z, R# n; u double mtmp;
1 K: k2 k$ {- R4 { int ix;5 h, j/ U. s9 l' H" n2 ?
boolean_T exitg2;0 U# A5 n: }4 G* ^
boolean_T exitg1;0 i' a+ P0 Q `5 Q, {/ G; \0 W
double YiZhenShuJu[800];
s5 X4 X6 H0 u9 B6 A( ^* z% w double dv1[800];
$ P; s$ r) `3 q1 c
% E/ E: Q. V5 P3 X, ]; ~. K0 {. _. w; _ [ f
double b_YiZhenShuJu[800];4 F7 |$ \% @! y8 {
double I_filtfilt[800];7 o$ ]8 V! Q! A9 x+ ?& W+ v8 E, [( v
double Q_filtfilt[800];% X2 Y$ G. x! N$ Y
creal_T b_I_filtfilt[800];- U% R" e7 i- p. q
creal_T b[800];
& v3 k9 {+ |+ Y/ n( w creal_T RCRxSignal[50];
) @- c% n# X2 l. C; g6 ~ creal_T fineCompSignal[50]; U6 |* K6 d& d. t( x7 {
double phError[50];/ B5 w7 z: V+ A) A! {& ^0 b) ]
creal_T timingRecSignal_data[28];
$ o$ Y6 E0 u0 `3 b( Q4 E( ] P int timingRecSignal_size[1];
" ?9 C+ O4 Z+ s1 A2 {3 f double prbIdx_data[28];4 v) E2 R3 q7 u* r' F3 g
int prbIdx_size[1];4 r2 \0 c7 Z4 r4 Q' Y3 x
double dtMt_data[28];3 F% \' K) r4 J$ v+ X2 P8 q# W2 Z
int dtMt_size[1];
* C4 w' l/ w3 c+ c' ]+ x# |7 q# i creal_T symFrame[25];
- L( R6 ^3 s) k( ^# p boolean_T isFrameValid;
0 Y9 e4 v7 m9 @7 J+ B2 Q* q double unusedU0[3];9 j6 |' E$ [7 O1 T) X9 @" u6 Q2 i
, R0 Q/ ]% U/ C7 ~" f# I# Q
//调试过程中的变量
9 K5 E# M) M6 y int enough_data;5 \4 x; f8 [! Q4 f2 X
5 h9 K0 i& C- O9 `
int enoughDataFlag;
3 S& J' R. A7 r+ o5 _ int yiDuanShuJu_mean_int;# p& Q- m) L$ F8 T% ^' _
int int_sum_dv0;9 }" i9 X; T2 X! Q! j1 K
int oo;
; W, n2 K. F( m- g/ U int ii;
, f: b. X+ i' m/ E myfuck=10;
* _/ A2 z" `& T+ P- w /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */ `: `: j. U! S5 x5 [6 Y" l7 b0 p: ~) R- q
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
6 x# V' P# x5 e8 Y$ A
6 [7 @, r$ q( z" e3 V yiDuanShuJu_mean = mean(data1000);+ R% M& G* F/ v* H I7 n9 i! v
! `* \3 L4 S, P) ?
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
8 S- Z3 D/ B* I7 o( i" E* x/ ~& N2 j, B UARTPutc('A');( h2 w4 ?8 l' U( Z6 _6 s6 c
UARTPutNum(yiDuanShuJu_mean_int);
: c5 B) B v) ~7 t UARTPutc('\r');5 C8 M/ l1 x6 q
UARTPutc('\n');$ [" R4 L# m! x% S$ n% S% |# u( f
7 S6 `- E( w3 ^) d* Q' u Q
for (ixstart = 0; ixstart < 1000; ixstart++) {
! D+ V7 [& ]. U0 u7 G8 I yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;7 d+ J5 ~( Z8 F
}! j( K% \ M; j6 u6 X- c
; I2 d% w+ F3 G& B& Q
power(yiDuanShuJu_LowMean, dv0);; `/ }+ R% U% p& p' U5 Z5 f' V/ o
1 u b9 h3 _0 K4 l int_sum_dv0 = (int) sum(dv0);
/ Z- t& Y$ N" \* C) y% g
5 [( W$ N! a' B4 t0 B0 | UARTPutc('B');
, C+ y3 Y* j+ W; _ UARTPutNum(int_sum_dv0);) M$ r1 S+ o3 \# U. N6 K6 A
UARTPutc('\r');
4 |( ^7 h5 \6 x/ H* E6 b UARTPutc('\n');
( [+ G H2 G) G1 H; y1 T+ c9 Z
' I0 ]" j+ x+ r) V* v// int compareFlag = int_sum_dv0 > 1.0E+8;( Q. l9 O$ k, _
" d# I: S" ^% `6 o" g2 m" k, | if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
2 {& `% }) n# O' Q5 |" B UARTPutc('C');
M8 I' z$ ]9 n6 D6 q8 _% v0 E /* 比较信号能量 */
2 s: I8 c+ u& o) Z8 ]& O /* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
* H! q& Y5 t; ]3 z7 M// yiDuanShuJu_mean = 1000.0 * youxiao_k;) w, S" t" D7 ^, e- n8 _
// for (ixstart = 0; ixstart < 1000; ixstart++) {
: D2 `! z) Z7 Y1 @5 |" a0 k// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =3 [; B: ]# G) y. m, D
// yiDuanShuJu_LowMean[ixstart];& i" H3 d4 }) i- ~4 U
// } F" W" S& b- G8 p! J. s$ l1 D
//! J: [5 ~* N+ d& T0 ~
// youxiao_k++;
7 d# d. ?& `8 j// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==) ~% G4 }; l/ e |7 v- e: F: w
// /* 感觉要取21个数,即0-20, */
& ^% V3 w1 w! Z e( c// enough_data = 10;//有效是10,无效是0
( d2 N+ U' h: n( l// }: t: H1 I, e: D$ L, c8 l2 {7 q5 G0 e
}
! g" D# I# _8 x# t
g0 z1 H! s9 {
" H' B3 o& q$ L' R& p" V enoughDataFlag = 100;! i V$ n7 s8 {3 f
enoughDataFlag = 1000;
; A8 m* P2 d& E& [2 b/ l enoughDataFlag = 0x02;3 M( M/ F; z# J( w& p% p
enoughDataFlag = 200;* G' H& q( G$ n( J
) C$ Y3 Z( }3 Z* Y5 z8 e3 d int myfuvk1;
1 V$ g7 H- Y! O5 |/ |/ T myfuvk1 =11;6 _( R0 x4 ?4 n ~" G& ?
% \; l/ W! V# ?9 I3 D6 J
+ Q4 C' S5 r/ {" W, k enough_data = 0;
' q# H; B" Y8 z" N& \: t; @8 \$ f6 w! R6 A' C
// if(enough_data>50){
" h9 o8 r0 X" S# t8 g- t// enoughDataFlag=0x01;. _+ F: H3 m& \$ Q/ P: F- u
// }else if(enough_data<50){. ^4 D& W; F& A* M5 L
// enoughDataFlag=0x00;//0x00还是不行
4 k: e S9 Q" R/ b6 t9 H; s// }9 A: n7 M0 @3 R1 W7 p
( V5 {% d; b- m. P; ~% A- O
6 n4 Z+ H( R+ ?; d: [5 M# u% D
oo=10;1 _9 d: a' k, e0 n
oo = oo < 5;) S$ T/ Y, o7 @2 s" r3 c
if(oo){
/ s/ [4 K3 S: ] ii=0;: G, [+ ^5 m6 v
}
- B* V5 |: }* ?6 n( e" [ if(oo < 5){
3 _7 U( V+ c4 b# [ ii=0; J6 a6 i6 O7 D' C" |% J4 \- R' k: Y" K
}
; Z3 _) ^! l0 c! B+ x' ` if(oo > 5){# i8 k( w* |! i2 F) A u
ii=0;3 g& a( `8 J1 r; q7 d4 C, }* c" R) A
}
: w* f2 h" X( a* [7 l% N) V' h6 ?, P
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
) b# W- l. P( b* U+ Y /* 如果数据足够才执行主程序 */
0 W) `6 E) Y8 F/ C oo = oo < 5;
& H* M9 {5 v4 _. k; o6 j: {) { enoughDataFlag = enoughDataFlag < 5;% S0 `2 h" U' U4 Q# f0 b
if (enoughDataFlag < 5) {$ ^4 T; s* ]3 R; U' h4 A
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
: N& B( Y3 {- `5 K" [6 i AGC_AGC(&pAGC);
% `6 }$ b# _4 Y$ i" Q9 I' I: r5 b* Y: r1 y" s
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);" H6 S' w7 \; U; R; x
FIRDecimator_FIRDecimator(&pRxFilter);* m2 ^( a# Y+ ^- Y6 L% p
K; P& ?% m8 t6 B B# B8 B5 d /* Downsampling */( [9 I( f+ B, X% o
c_SymbolSynchronizer_SymbolSync(&pTimingRec);
8 j5 ?8 x! Q+ ]/ B1 b
7 ?" F$ O0 ^9 F _! ~ c_PreambleDetector_PreambleDete(&pPrbDet);3 W% b3 p; U7 Q* Z) w
! r0 p2 z& L: o/ m
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
/ |1 V/ w. ~! q' Q7 Z# B /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */$ O' Y7 l3 ?- h8 C3 l! k9 _6 }* [0 ^
/* %帧数量=100 */
. a8 w E2 w9 [ pFrameSync.isInitialized = 0;% _/ c4 p3 n* O% L( c; v2 Q+ T
& S8 k5 s1 Z8 W
/* [EOF] */
' v- {8 `( f% A4 |6 o; C) u) R5 \ /* 前导码长度是13 */4 O: s% X8 `( Y; F$ E2 |- J
/* %qpsk */0 \, l: k; S; x7 ?4 Q4 [
pDataDecod.isInitialized = 0;; h6 G9 r2 T3 V8 I+ L+ x/ f9 g
& C5 h' k3 q+ W+ p5 o, N
/* end */. [* @! Z& y; J: q+ b A) t
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
* K. X- c- Z( h& N9 b /* Convert 3-dB frequency */
" d, x* k+ A6 D8 f% e /* Convert 3-dB frequency */1 {8 ~3 ?) I9 K6 j$ _
filtfilt(save_buffer, usable_left_filtfilt);
9 i. ]9 Z( D1 g5 y) H G L! }# D$ W for (ixstart = 0; ixstart < 81000; ixstart++) {
& F' U3 C1 y }+ I1 K usable_left_filtfilt[ixstart] *= 2.0;, q+ `$ G- e( B: T
}
/ e8 ~7 p1 p9 k9 F
* N: @- v' V" x- O /* 注意乘2,处理幅度 */2 i C; j% @! {& l
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */7 ]9 ?) H- w3 X2 }9 K5 B1 b3 b2 D
/* %% 行列转换 */$ \2 q8 I6 b+ a! Y: _/ D7 j
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
( D( L7 j. I6 Z& y% o. q5 B for (ixstart = 0; ixstart < 81000; ixstart++) {
7 B7 q2 M7 T7 H( } N9 [( { youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]$ o+ u* ?2 [% @/ y4 Y
- yiDuanShuJu_mean;
: \2 P9 i/ h3 x6 D3 X \; Z1 ` }
+ B7 L5 h+ ]2 @1 W$ F" A/ u }3 R" p
: I/ H- P: K8 I1 k: Y2 p+ d1 M /* %% 应该对数据归一化,但是这一步放在哪比较好 */* L& M' F* ^- J1 V4 {& v
ixstart = 1;2 o* I( k+ O$ k) e# r
mtmp = youXiaoShuJu_QuZhiLiu[0];
0 T2 n: X7 ?7 L/ v+ n* S# m! T if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
3 r d/ g$ e7 I' N ix = 2;5 H# H* ~' Z M: {
exitg2 = false;" O3 b( T9 a4 K# [0 V6 n' q0 ~/ W
while ((!exitg2) && (ix < 81001)) {
/ [, k( s- y! v3 P ixstart = ix;; ~3 r) q" k% N: x
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {+ G. n0 r( o7 W" L# \ o
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];7 b1 x% H" i; w8 j9 d1 g
exitg2 = true;
2 i! U! D( `0 x3 O- C } else {8 p" |7 d% [) i# |* w
ix++;8 n4 q# S" J' d& E% c% n5 _, u
}& l( ^8 J5 c; e/ o
}1 ?* m3 }9 p3 t% K6 d1 ?4 i
}
6 }6 Y: E& o9 ?& C3 ?" u, j2 g1 b* L: R4 L. e# M0 w) M; b" _
if (ixstart < 81000) {9 t( C# V8 ~! U; P' L- p1 M+ r
while (ixstart + 1 < 81001) {
+ y' x, p4 a" ?5 c+ k8 t/ E if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {8 N7 O: V. O% W
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];; g5 k+ Y7 }% u) H+ H
}( D& X2 D# y2 u) [9 `, d: a
0 V$ X0 F' U" ?3 \ z
ixstart++;
2 X& h W( G- u; t& W }* x" l( ]& w" r; s/ H+ H
}
# I7 k9 i. n0 {/ {' m. u( p( h3 R; P7 v) a
ixstart = 1;) ] O2 O8 L! b0 @/ j6 s6 v) G
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
; }1 F n! L+ z- f% v/ H if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {2 R- p" i% A/ I7 [4 M3 }6 W
ix = 2;
. U4 p6 }5 ` h; a0 g( G exitg1 = false;1 T* E9 U. m" s& }
while ((!exitg1) && (ix < 81001)) {
, t; ?5 Y5 k% n6 r) J( q ixstart = ix;% Y0 m7 T9 @) u' [' D
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {4 U9 ]+ P) }) `8 ]9 H* a+ {
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
! {# p! e# [6 e! m5 W exitg1 = true;
2 B6 T. Q l% @3 U$ }0 Q } else {# ^: o' |: J" \' U2 i
ix++;
2 Q7 s8 K |$ C k$ B3 P }
3 I4 q: |/ f8 f; @" o+ Z. [ }
3 j2 O! W# `$ R1 B1 u }
0 l) U# k$ M. a
) l4 R9 W8 Y4 w; Y. @) F/ ` if (ixstart < 81000) {8 e5 u% H( L0 y0 K
while (ixstart + 1 < 81001) {
8 G# z* d+ C G if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
5 b& ~8 @. x) U9 j7 l Q yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];. _4 p. z4 S e
}
; {: t6 E7 s5 O3 l- _$ C! Y, R
# @- F f: F8 G. S! f! ]: }& e ixstart++;' n9 N5 h6 n4 \$ q
}1 A1 I# s6 U/ M1 P) o5 Z* c) [
}
, _& |3 }' c! q& A2 D9 W4 X: q+ I0 g# H
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);5 ]- B S; B. e+ q7 ?0 y2 P+ G
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
/ _) n$ B7 ^! Q8 w" M yiDuanShuJu_mean = mtmp;, s/ B# u# N: g3 V5 U
}) Q& |: I( ^6 Y0 h8 B4 N# w5 J
7 ?$ w) P% J" H" L* D8 ?9 y /* 找出极值 */
: i6 \" ?$ c$ o( f for (ixstart = 0; ixstart < 81000; ixstart++) {
# J( K1 a* b6 ? youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
" w/ n% ^' f/ ~) V8 O+ s }0 i1 S* r( W- M6 {
% a( V/ f; {4 |1 F/ j6 I --------------帖子字数限制------------------
/ ]4 I; E& Z' u3 q Z9 C, u3 ^}) w$ z( l0 E5 R
3 d @4 K; v; m" ~) ]* M# \/ c, W: h( k* p3 J: Q4 K8 ] b
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|