|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
; @* [/ ?" b: [: J( _+ x! j# }3 f" m" ~# w
各位大神:
4 w- t/ t6 u% c1 l$ E 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
8 }! S$ u" z9 C3 ^" C8 t7 F4 ~ 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
( ^6 X2 H& C( ]+ i3 {- t' e2 b+ h: e7 W9 S* c @1 y
* @4 r. e n2 W W+ @
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
9 @" E$ F2 G+ o$ f( f$ ~( D- W, M! o3 H3 x: g, o; \# [
并没有其他线程
( {7 U& X; D8 K- K: l* B/ s反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
, j/ ?" T1 A% ~4 a" L# T y也说不定是和堆栈有关系。。。。。。8 z- ]3 k4 H6 G1 M3 `) p
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....$ o; {1 a. D+ U' ]* C9 h7 v4 M
) H8 _% Z* B# ~4 D
1 K7 ^* T! y, Q6 _! q: P+ X# R
; T0 Q2 [" J: c! G我也很绝望啊,希望大神能帮帮忙,感激不尽,!& B' ]" {# ^2 D! s7 ]; b
! _+ U2 a4 H: A; a! a8 g8 H
& V+ a# d3 V! g/ {附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
) a! f3 b* r6 ~) [ static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
+ y @2 K4 B/ [- D2 W4 X/ y, d2 B
& K, y% K' W# Bboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(. Y) t( j; y! h) G- B
const double data1000[1000]) {$ X9 g/ s" o, N4 V K P6 @
; |* S; `, e E j1 h
int myfuck;/ ~" u3 A" F$ w4 |5 F4 ~$ B8 ^
double yiDuanShuJu_mean;
- a# d ?) Z4 {# r4 l2 G* n! a( H4 W double yiDuanShuJu_LowMean[1000];
" ? h+ B( \2 {. E( G int ixstart;
1 u2 ]+ A9 d: \ double dv0[1000];, J, V3 A+ w8 d' ^* x- r( {
comm_AGC pAGC;. R, v3 ?1 r- m( ]2 W
comm_CarrierSynchronizer pFineFreqCompensator;# n9 c0 A1 b+ C! y4 Q' ~# O
dspcodegen_FIRDecimator pRxFilter;8 L9 K0 ~$ U# I
comm_SymbolSynchronizer pTimingRec;# C# l7 @! n& s5 R! D6 O2 Y
comm_PreambleDetector pPrbDet;+ R0 |+ g2 C9 X K& F
FrameSynchronizer pFrameSync;
- ~4 \+ d" G5 R QPSKDataDecoder pDataDecod;( Z4 f# J: s8 A3 w$ g& s, a6 W5 G$ j) N- l
static double usable_left_filtfilt[81000];
1 x G4 E# ~& M! p& _ static double youXiaoShuJu_QuZhiLiu[81000];
2 D: k, j6 n1 ~( g) q4 s double mtmp;6 ~, G1 u% L' q
int ix;
/ r4 A, R$ _! G" g* P# B1 C boolean_T exitg2;
. {/ f/ s v E- F( H' } boolean_T exitg1;# X: Z" I& `0 \$ l- U
double YiZhenShuJu[800];
9 a1 p Y2 g% t double dv1[800];
6 n) a+ @" `3 X% r1 p* E% R3 m+ t. S
: ` J4 d' m# f
double b_YiZhenShuJu[800];% E& h8 a3 Z6 k, p2 A9 X9 H
double I_filtfilt[800];
7 G* {" L+ T1 E! j# B2 w& T double Q_filtfilt[800];
/ g9 e- i. V+ t, U; H& } creal_T b_I_filtfilt[800];
* v" @/ R9 x$ q6 h% H creal_T b[800];3 @( t5 p. Y9 [& t
creal_T RCRxSignal[50];" k6 H( m0 Z6 q/ R7 N0 p; D
creal_T fineCompSignal[50];
0 @4 c" f6 P; t. U4 ` i double phError[50];
& K4 ]0 _8 u2 e: P3 ], e0 _ creal_T timingRecSignal_data[28];% Y' p2 j+ e, M$ L% T4 ?
int timingRecSignal_size[1];- B) x8 [; b- J7 H
double prbIdx_data[28];
, Q) [& ]6 G) r" c- @ int prbIdx_size[1];
# {% O( A1 c1 l! ] e& J double dtMt_data[28];7 w/ W/ t W p. ~
int dtMt_size[1];
- {. p) h8 Z( V creal_T symFrame[25];7 o3 m& L2 l( |9 V' \
boolean_T isFrameValid;" Q7 L1 G1 i' F0 _, P ] I6 s
double unusedU0[3];6 V% ]) s$ `# u; I3 X
. Y, P2 q$ N2 _* d8 M
//调试过程中的变量0 ~# q" x1 }; M2 e& L ^( k
int enough_data;* T7 I$ d! t: ^( D! l
: x0 x9 ?, q5 L
int enoughDataFlag;* Q/ I+ A8 h! ^
int yiDuanShuJu_mean_int;
: {7 [# Y) @" b3 L9 Q% ] int int_sum_dv0;
+ s: |: ` w5 e0 q# K int oo;
$ T- r+ k0 Z, O" c int ii;
* f% {7 K7 f& K6 C% H7 K2 G. {4 e# x$ p myfuck=10;
# \$ b$ D! l6 W /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
7 ]# w5 U- e1 M) b. u8 j- I /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */" P: U/ r$ N3 Z! ]0 j9 k
4 Y4 g1 M1 s( ]* V9 R yiDuanShuJu_mean = mean(data1000); E2 ?: ? @" n7 g/ V! ?6 N2 _
% O& Q/ j0 Z3 R
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;/ a& r# i1 Z1 R) ]; B; i- j
UARTPutc('A');2 K6 |' A9 E. ^
UARTPutNum(yiDuanShuJu_mean_int);# F Y1 W* p% |8 l F
UARTPutc('\r');
8 v6 @+ s3 n0 z; J UARTPutc('\n');
0 s& T" y' e6 Y @) R
1 ~+ S0 \" ?2 e9 [ for (ixstart = 0; ixstart < 1000; ixstart++) {
: |' ]: M, N& L yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
w1 U# T+ e5 t0 |! I: f( E! K1 `7 T. U }
" ?! \4 ?8 F& W" h. L5 N: u* o
0 p4 S2 M" N/ U. E6 E power(yiDuanShuJu_LowMean, dv0);
- B; V) k* V& H) D" O) |+ `% P/ ~. B# U3 S2 w% h, C
int_sum_dv0 = (int) sum(dv0);
" L4 d* ]3 B8 h
2 O' z+ e. x, x! D9 T- K UARTPutc('B');0 a3 p: n" H4 g. {
UARTPutNum(int_sum_dv0);5 l& Y! s, Z. F0 P; I4 j
UARTPutc('\r');
! j) n1 k5 j6 E+ `3 f& x5 Y0 h UARTPutc('\n');* r- O9 V( h9 {
5 }) f7 | O4 b) A! B7 S
// int compareFlag = int_sum_dv0 > 1.0E+8;/ U! ^" U8 A2 L8 _: O3 b
7 R, v" _' D0 {! r8 d5 ?( A if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
/ R* d$ c/ F1 z, N1 _ UARTPutc('C');
& k, f) F' I f" q& u/ [0 M /* 比较信号能量 */
. d( C$ E, j$ J s1 j /* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */! b: t9 Y S2 T: h6 w
// yiDuanShuJu_mean = 1000.0 * youxiao_k;+ q9 {5 a& S, B# O. ?' C5 w) s
// for (ixstart = 0; ixstart < 1000; ixstart++) {/ U$ | j/ _' r9 T, k
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
; X' B" B$ m% Q' b1 q! Y0 N5 c// yiDuanShuJu_LowMean[ixstart];
" L5 W5 w6 n" ?" S, X8 @ l" K// }6 T. p& V4 D2 B
//
' H( j- V1 x8 A// youxiao_k++;3 V1 ~ x( n) ~
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==/ K5 c, N6 m# P* n z' s! |
// /* 感觉要取21个数,即0-20, */& Y/ F- x9 X: z, m- c
// enough_data = 10;//有效是10,无效是07 l( V5 V/ Z% X, R3 x6 {
// }- s- |$ [8 {8 {4 L$ V* e
}
5 m% G9 h# d7 ?8 {
' u; p2 L1 L/ v; m! E1 ~; q2 E" i; U& ?
enoughDataFlag = 100;, g! h& X+ v$ [: C- U
enoughDataFlag = 1000;
$ M* |5 p# \1 x: V9 U" T u7 V7 S enoughDataFlag = 0x02;
( r7 z# \$ r( C' q7 a enoughDataFlag = 200;7 s, v- C+ |4 G; {8 E
8 F! x9 |1 k+ z
int myfuvk1;( X* ^2 }9 \9 m2 f. S. w' G Z" }
myfuvk1 =11;: E/ ~" A: ~% x. n* `
' g+ j: }; w) Y& c& T" {) k5 }4 a6 m5 I: A; w4 q7 c
enough_data = 0;1 {( ?8 t( x- v. ^# m% r
5 K2 ]& }, ~/ `8 M// if(enough_data>50){
% C# ^5 i M2 A// enoughDataFlag=0x01; b, I: H. _ @
// }else if(enough_data<50){
n1 p$ T* w. T% F// enoughDataFlag=0x00;//0x00还是不行- k5 v, E, f0 z5 s6 D
// }3 P1 D, \9 v9 S. D$ Q" r
. a" l1 }( j6 O. H0 A
5 E+ S- O% `% E
oo=10;
6 ], A3 ^! P. x' s4 P oo = oo < 5;
6 F( w, e3 r" a$ ?1 n4 |: w if(oo){
4 U) m6 s/ z! L& F) Z/ } ii=0;
# x8 u1 s9 u% s3 a }
2 X/ d) ~0 ]+ H9 W/ b if(oo < 5){
% l$ p2 W6 F. } ii=0;
+ }$ D6 R* _6 a7 |1 \3 _ }
' g% h+ B. L# V if(oo > 5){
9 A4 b+ n9 X9 y$ ? ii=0;) O/ G* c1 T- e1 T$ ^. q
}
) N( P9 ^9 a. p7 a7 q, D/ y2 F
6 e' h0 \$ d' \, p- I& `' \' ^ /* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); *// v9 e- t8 N5 q+ R. R
/* 如果数据足够才执行主程序 */ N0 n; T% m/ g" N" s& I
oo = oo < 5;
9 n* i6 c5 _6 N# K. d* S K/ g enoughDataFlag = enoughDataFlag < 5;
) B+ |" j$ P6 P: t5 i& s3 R) X if (enoughDataFlag < 5) {# p1 @% s7 C' e4 V) W* K
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
! w7 Q! ~# J$ ~( L! d AGC_AGC(&pAGC);
' [* d% @0 T, I5 |; K' v6 F
, b& {& }7 K/ L" p; J/ L2 k c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
! f& p2 s2 Y5 P+ Y+ d FIRDecimator_FIRDecimator(&pRxFilter);
7 z" }) @" @2 W+ g& i: z8 f$ o6 }
' l* Y# B. Q; b- s /* Downsampling */( [0 r* F1 z+ V) U: D" ]
c_SymbolSynchronizer_SymbolSync(&pTimingRec);) M1 W6 b2 ?% g: b! @" o
; O, z0 _! X: N" T6 j. B- i
c_PreambleDetector_PreambleDete(&pPrbDet);0 O/ @+ F- g9 v( {6 X
& c: L4 X' b9 \! A+ {8 ~/ H /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */5 ]7 m5 y! ]( x- a! W+ X9 }$ I
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */1 p! s( Q+ R3 |) p% K% A
/* %帧数量=100 */
6 Q. o" O* A0 L pFrameSync.isInitialized = 0;
. K8 L1 e$ }! \" S' S- O# l; Y! i6 Y4 A$ i( C8 y1 n6 F" z
/* [EOF] */
; r } Y) W% H" Q3 T t /* 前导码长度是13 */+ S* D8 p& e( x& U5 S
/* %qpsk */* c4 U3 N7 ?. @6 f1 e8 L4 ~
pDataDecod.isInitialized = 0;! |; l/ h" Q# J- D3 H
6 b' j1 f/ {% z- _% c
/* end */* b0 y2 e. n( }2 J8 Z+ h$ i" ~/ v
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */. X) C2 U. [9 F
/* Convert 3-dB frequency */- \9 o/ k7 w4 c" V
/* Convert 3-dB frequency */3 r/ ?# m0 V% v2 ?" r+ h: ]7 [6 R8 [$ K( N
filtfilt(save_buffer, usable_left_filtfilt);# k2 h. V: z/ ]2 R
for (ixstart = 0; ixstart < 81000; ixstart++) { g: F* ]8 D% W. R: l( B6 C
usable_left_filtfilt[ixstart] *= 2.0;
$ Q( L/ `/ D' l) i+ f }
/ ^$ I3 D5 p. P; \- f& T- Z
. d2 H' u5 v) @- u0 @' K /* 注意乘2,处理幅度 */
4 f4 i9 \" n3 d( U. M /* %% 我发现带通之后其实就均值为0了,不用这一步了 */
" j. Q0 ^" D: I /* %% 行列转换 */6 V( G! X5 l1 n7 Y+ L/ N
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
3 I: P- u7 m0 |' Y. a for (ixstart = 0; ixstart < 81000; ixstart++) {
7 G% j8 p& f4 f! T youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]) O0 G5 U5 k% A ^/ p p6 i
- yiDuanShuJu_mean;9 o1 k% ~2 V7 |- w% ~* r) d5 A
}% O# c. ~; { Q( T) D: o
) T8 V0 e9 @/ H /* %% 应该对数据归一化,但是这一步放在哪比较好 */) t3 V+ P4 k- m" J3 a u
ixstart = 1;
8 Q6 s9 q; D$ D f6 x mtmp = youXiaoShuJu_QuZhiLiu[0];% K5 J: `' e+ O0 e. `2 s
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
8 x. n0 a- Y/ ^' Z' |: L3 x ix = 2;! Q( W/ ^" ^2 S9 M' i+ q9 \+ W8 M, r
exitg2 = false;. P& [+ v0 Y6 Z/ ^8 n! |. D1 t
while ((!exitg2) && (ix < 81001)) {
& d2 U; k5 h2 T" d ixstart = ix;* Z' _5 u- w* K% B. @
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
! S! [: T# \4 g( O mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];$ N. [: ]' p# t6 E
exitg2 = true;2 C/ @6 e. E. E$ F z+ j
} else {
1 }7 s3 F* D5 f0 V! V |1 \ ix++;
0 o% g$ _4 z& }# { }
: s* o. T) R2 v" i, T& O& } }! E: k4 x$ |9 F' t5 O
}1 K' i" U# X, W8 ]
4 l! `/ y" c/ }" O* o* Y& U
if (ixstart < 81000) {
" P% i B) D1 y. o4 P3 j5 y, B while (ixstart + 1 < 81001) {: [5 O9 t. w7 U) u$ k
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {, _; }1 X8 A& y$ s( E; u8 g4 ^
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];5 f" { Z' U3 E$ C' V6 l
}! W+ \ G/ j) Z3 X: `0 b
5 N( B& @9 L6 T6 q2 J ixstart++;# E4 S# u6 j+ I; Z2 ?- o+ L0 A
}5 X% y+ O- ?1 A7 X/ S; N
}
$ W) M% o9 t0 G- q* @
* u0 y3 G1 m$ I* N, ^' C+ o3 q+ { ixstart = 1;
4 \; {$ o4 @' G8 @, V5 N yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];* b W, S( n" P: Q4 M
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {+ ]' F+ H! `1 L6 P* `: s
ix = 2; z! \5 a9 B5 d3 v+ f
exitg1 = false;
6 j; C1 _* w. F# M7 v* d5 q8 Y0 n2 g while ((!exitg1) && (ix < 81001)) {
8 Q$ c6 K; H' R ixstart = ix;6 \8 B7 f# v) p' Z1 |6 u
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
. \ c; u3 B2 `) P V yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
0 ~. h/ R, T+ }! ] exitg1 = true;
! x4 k5 s+ I* F% g. O$ J+ l } else {7 S% Y" m, l# g/ M! [8 }
ix++;
' |" K/ X4 w; F+ f. c6 s$ [8 { }6 O4 y3 D; Z" p/ n, h3 o9 ^
}
$ c* s" h& Q1 c* a, ` }
5 \; y! S) @! l* D6 ?# H! R( F; u# G: n) r
if (ixstart < 81000) {0 G u+ {5 z* ^! |' b7 H) ^& m
while (ixstart + 1 < 81001) {
5 I) \9 K" _0 l) E1 V% _ if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {4 [9 D2 f, `- O+ p* |/ v' t
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];1 T+ b/ q W% c" s! \. O) }1 H& e
}" i* z3 z. |$ o# D) ^% X: \; c( y" o
+ ~) I! A A- S7 Z- @ ixstart++;
8 q: Q A6 V; l4 q* j7 D& |1 ?7 j }$ x; k4 R. U3 a, Z& P& z. J
}& U d( K- w/ ~' u0 M! k
( L! C' R' E1 F. K; x
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);5 N2 x! ~6 H: X X1 H
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {/ B$ W, y7 ?4 X& z# I
yiDuanShuJu_mean = mtmp;
# ~) _7 F0 R8 N% x }
0 w+ u1 J& M* H- o5 H
! u! P2 u6 P0 q- Y' ^' M: z6 G /* 找出极值 */
" J0 _0 F$ P" k8 q for (ixstart = 0; ixstart < 81000; ixstart++) {
7 r- S8 ]' t( n& b, K youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
! {3 U- C5 M! T/ g }) P! w- h4 \! O6 F' ^" k% Q5 c, Z
9 r ?" k8 A5 [" A. _- v" H. v0 a8 ? --------------帖子字数限制------------------
8 {, ~9 Y5 K- p. a u9 O- R1 u}
4 z1 P6 C7 e. r3 O4 r8 R/ } I
8 J4 c. k" {% t( {3 S6 j1 D4 Y8 g2 I7 D
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|