momo zone

调核人的blog

Monthly Archives: 八月 2009

转文—LPCM输出同BitStream输出的区别及优劣

谈到蓝光技术,不可避免的会涉及其中的次世代音频。由于蓝光碟的高容量,使得更高码率更多声道的音轨成为了可能。因此,在画质提高的同时,音质的提升也成为蓝光碟的一大特点。在现实使用中,常让玩家感到困惑也许的莫过于次时代音效在音频输出设置时究竟采用LPCM还是BitStream为佳的问题。要比较说明这一问题,首先要说说无损压缩(PCM, Pulse Code Modulation, 脉冲编码调制)和有损压缩,因为这是解释目前高清LPCM和次世代音效的基础。

—————————————————————
什么是LPCM
LPCM(Linear Pulse Code Modulation,线性脉冲编码调制)是一种非压缩音频数字化技术,是一种未压缩的原音重现,在普通CD、DVD及其他各种要求最高音频质量的场合中已经得到广泛的应用。
各种应用场合中的LPCM(PCM)原理是一样的,区别在于采样频率和量化精度不同。普通CD规格为16bit/44.1kHz,DVD的规格则有多种,量化精度可分为16bit、20bit、24bit,采样频率分为48kHz、96kHz。此外,LPCM信号中可录入杜比环绕声信息,供现有的杜比定向逻辑环绕声系统使用。
VOB文件有视频、声音、字幕数据流组成。视频数据流是MPEG2格式,音频数据流是AC-3或者者LPCM、MPEG2、MP2、DTS等等,AC3基本上是事实的标准,MPEG2多声道只在极少数2区碟上可以看到(比如In the line of fire,2区).PCM主要用于音乐DVD,而MP2只在廉价DVD上才有.PCM是高质量无压缩数字音频,因此需要太多的空间,并不适合用于DVD电影光碟。AC3的数据率介于192~448KBPS之间,192KBPS用于双声道,384~448KBPS用于5.1声道。
音频数字化主要有压缩与非压缩两种方式。较早出现的数字音频播放机,如CD唱机和DAT录音机,均采用线性PCM编码来存储音乐信号,为非压缩方式。在高质量要求的音频工作站和数字录像机(如DVCPRO)上,现在也采用非压缩的格式。
  我们目前常见的MPEG、Dolby Digital、DTS包括次世代的Dolby True-HD, DTS HD MA等则为压缩方式。压缩分为有损压缩和无损压缩。有损压缩的目的是提高压缩率,降低占用系统资源。可以根据实际需要选用不同的采样速率、样本分辨力(精度)和数据率。
 
  非压缩编码(PCM)
 声音之所以能够数字化,是因为人耳所能听到的声音频率不是无限宽的,主要在20kHz以下。按照抽样定理,只有抽样频率大于40kHz,才能无失真地重建原始声音。如CD采用441kHz的抽样频率,其他则主要采用48kHz或96kHz。
 PCM(脉冲编码调制)是一种将模拟语音信号变换为数字信号的编码方式。主要经过3个过程:抽样、量化和编码。抽样过程将连续时间模拟信号变为离散时间、连续幅度的抽样信号,量化过程将抽样信号变为离散时间、离散幅度的数字信号,编码过程将量化后的信号编码成为一个二进制码组输出。
  量化分为线性量化和非线性量化。线性量化在整个量化范围内,量化间隔均相等。非线性量化采用不等的量化间隔。量化间隔数由编码的二进制位数决定。例如,CD采用16bit线性量化,则量化间隔数L=65536。位数(n)越多,精度越高,信噪比SNR=602n+176(dB)也越高。但编码的二进制位数不是无限制的,需要根据所需的数据率确定。比如:CD可以达到的数据率为2×441×16=14112Kbit/s。
  常用的编码码组有3种:自然二进制码组(NBC)、折叠二进制码组(FBC)、格雷二进制码组(RBC)。国际PCM标准主要使用FBC。

  压缩编码
  PCM虽然为无损压缩,但由典型的音频信号表示的信号特性没有达到最佳,也没有很好的适应人耳听觉系统的特定要求。PCM的数据量过高,从而造成存储和传输方面的障碍,因此必须使用相应的技术降低数字信号源的数据率,又尽可能不对节目造成损伤,这就是压缩技术。
  人耳的听觉心理有两个特性:频率掩蔽和时间掩蔽特性。人耳在安静的环境中有一个静听阈(门限),即对应于人耳能听到的频率范围能被感觉到的最低声音强度。频率掩蔽,即当一个单音单元出现时,产生一个新的听阈曲线(同听阈),在此频率附近的频段内,门限均有不同程度的提高,以中心频率为最高。时间掩蔽,即当一个强信号出现时,其前后一段时间内,业已存在的弱音可以被掩蔽不被听见。在听阈以下的音频信号不需要编码。
———————————————————————————————————————————–

以上啰里啰唆说了一堆的名词解释,可能有不少朋友已经和我一样看晕了,而且心中的困惑反而越看越不明白,恐怕大家想要了解的是到底是LPCM好还是BitStream好这么简单的问题吧。根据字面解释,LPCM是无压缩编码,而即便高规格如Dolby True-HD, DTS HD MA都是有压缩的(虽然这两个次世代格式都是无损压缩), 那么看起来似乎应该是无压缩的最好喽? 其实不然,原因何在? 其实这个问题涉及到LPCM输出和BitStream输出的解码方式的不同。

————————————-
内置解码(LPCM输出)与BitStream的区别

高清音效的解码方面主要分为“内置解码”和“Bitstream”两种,前者主要由播放器方面负责,当播放器在读取Dolby True HD或者DTS-MA Master Audio讯号后,将会透过内置的音效芯片进行解码,并还原为MLPCM(多声道LPCM)输出至功放,最后再由功放处理MLPCM音效;后者则直接将讯号以“Bitstream”方式传送至次世代功放,然后次世代功放再使用内置芯片进行解码工作,理论上在音效方面会较播放器解码效果更好,不过两者均视乎播放器与功放的规格和支援情况而使用。

————————————-

而目前要使用BitStream处理高清音效,除了影碟本身要提供有关规格外,播放器及功放本身也必须支持,另外在设定方面也要作出设定。因此,在早期由于高清播放机未能输出Dolby TrueHD和DTS-HD Master Audio的数码流讯号,大家最常听的,可能是另一种高清音效–多声道Uncompressed PCM,大部份早期面世的蓝光碟及HD DVD碟设有多声道PCM输出功能。而这时即便阁下的功放支持Dolby True-HD和DTS HD MA,同样无缘聆听这两种音效而只能以LPCM的方式聆听(最典型的就是PS3, PS3 2.30版本以后都开始“支持DTS-HD Mater Audio Lossless”,但这并不意味着PS3可以通过HDMI来BitStream输出,而必须是使用PS3内置解码后使用LPCM输出,因此这种情况下,如果阁下用PS3播放DTS-HD Mater Audio音轨时,次世代功放上显示的并非DTS-HD MA而是LPCM5.1或者LPCM7.1。 )

可见所谓LPCM输出和BitStream输出,在播放蓝光碟片时我们姑且可以简单理解为 LPCM是使用蓝光播放器内置的音效解码器进行解码,然后通过HDMI线将解码后的音频无压缩传输至功放进行功率放大及喇叭分配; 而BitStream方式则是在播放器内部不进行解码,而是传输至次世代功放中进行解码。因此,无论是LPCM还是BitStream, 其实都是要进行解码工作的,其分别就是LPCM是用播放器解而BitStream是用次世代功放解。那么究竟是用哪一种解比较好呢?这又涉及到播放器同功放的规格高低的比较了。普通来说,如果玩家是使用普通蓝光播放器接入次世代功放解码,那么也许还是使用BitStream比较好。当然如果使用的是发烧级蓝光播放器,那么效果如何恐怕是要阁下自己比较了。(简单举例,大家认为是家里DVD播放机解码AC3/DTS效果好呢还是用功放解码效果好?)

要说明的是,本文的比较仅限于相同片源采用LPCM方式还是BitStream方式输出为佳,如果要比较LPCM,Dolby True HD和DTS HD MA自身的优劣则是另一个话题了,那将涉及的是bit rate,kHz等的比较,和本文着眼点不同,在此不再赘述。

最后再说一点,正因为LPCM是解码完成后的输出而BitStream需要在功放中解码,因此如果有玩家有蓝光播放器而只有较为老旧的非次世代功放,那么可以选择LPCM输出到功放上进行播放,当然要听LPCM5.1/7.1, 还是需要阁下的“老”功放上有HDMI接口,不然就只能遗憾的听LPCM2.0或者旧的Dolby或DTS格式了。

AS2 tween 和 easing类的小总结

Easing类主要是用来做各种缓冲动作,比如弹簧效果.
 
Back:在一个或两个结束点过渡范围之外的扩展动画,类似溢出效果.
Bounce:在一个或两个结束点过渡范围内加入回弹效果,回弹的多少决定于duration延持时间的多少.长的延持回弹的次数就相对多.
Elistic:发生在一个或两个结束点过渡范围之外的弹性效果,弹性的力度不受duration的影响.
Regular:在一个或两个结束点加入减速动作.这个特性可以帮你做出超速可减速的效果.
Strong: 在一个或两个结束点加入减速动作,这个效果有些类似Regular.不同的地方在于比较明显.
None:从开始点到结束点加入恒定的运动,没有效果.
以上六种easing class类每个又包含有三种easing method方式.
easeIn:在过渡的开始阶断产生easing效果.
easeOut:在过渡的结束阶断产生easing效果.
easeInOut:在开始和结束阶断均产生easing效果.
 
 
tween 类主要是用来做缓动处理,注意,不光是mc的位置缓动,也可以做其他对象属性的缓动处理
 
 
 
一个简单的motion 动画,效果是向左缓动,且伴随模糊效果:
 
import flash.filters.BlurFilter;
import mx.transitions.Tween;
import mx.transitions.easing.*;
import flash.filters.*;
var bf:BlurFilter = new BlurFilter(0, 0, 10);
var tween_handler:Tween = new Tween(pic_mc, "_x", Strong.easeOut, 550, 0, 3, true);
tween_handler.onMotionFinished = tween_alph;
var tween_blurx:Tween = new Tween(bf, "blurX", Regular.easeOut, 0, 5, 8, true);
var tween_blury:Tween = new Tween(bf, "blurY", Regular.easeOut,0, 5, 8, true);
tween_blurx.onMotionChanged = function() {
pic_mc.filters = [bf];
};
tween_blury.onMotionChanged = function() {
pic_mc.filters = [bf];
};

PS3 slim 垃圾啊

真不敢相信自己的眼睛,新的PS3如同一山寨产品, 外壳做工塑料感极强,感觉十分粗糙。 唉~~ 赶紧去找当年的60G豪华版,那个才有购买价值。  话说我买得起玩得起吗?  没D版~~
 
 
看到这里不禁感慨sony的审美能力下降了N个档次, 从ps3到ps three ,从索爱T628 到KXXX ,从MD的设计到现在MP3的设计, 真是越来越不如了。

SAP Request utiles

进入SAP request 管理界面(SE10 or SE01) 可以使用菜单"Request/Task" 中的选项进行有效的调整,降低在transfer 之后出现问题的概率。
 
Request/Task ->request->protect : 给该request下所有object 上锁,使其他人无法更改所包含的object 。直到该request被release 或remove protect,再或者加入user 到该request。
Request/Task ->complete check->Objects(syntex check) : 执行常规语法检查,建议在release 之前都要执行该检查。

Request/Task ->complete check->check request consistancy: 执行完成性检测,防止多个object冲突的状况。

Request/Task ->complete check->check inactive objects : 执行检测,快速显示未激活的oject,如有这种情况也可以在该项快速激活。

Request/Task ->object list ->sort and compress : 对于多次修改的object(如多次修改一个表)重复进入某个request后,如果后来要对该request更改,则必须进行该操作才能继续执行其他操作。、

参考:

http://help.sap.com/saphelp_sm32/helpdata/EN/b6/b40613a44411d1846d0000e8a57770/content.htm

 

 

 

 
 

SAP AP enque fixed !

 

终于把lock table 改大了,晚上可以不用再被打扰了~~ 

另外这里记录一下SAPosCOL 仍然没有启动,我真的怕忘了

GT 修炼

看了GT4的office guide 才知道, 车子的轮胎的垂直抓地力和水平抓地力总合为定值,也就是说车子如果所有轮胎的抓地力为100 那么过弯时横向抓地力为30的话,那么垂直抓地力为70 . 如果垂直+水平抓地力 > 100 ,那么车体会出现侧滑. 看来防止侧滑是有规律可循的, 而不是仅凭驾驶经验推测的. 此外还有关于限速侧滑器和差速限制器这些可选部件来防止侧滑 : 
 
 
非常容易产生侧滑的S弯道, B级驾照的必经之路.(调整悬挂系统的缓冲和弹性可以减小侧滑 )

PS2 & VGA output

最近搞了PS2的色差线和D-bus转换口,测试了一下,效果相当不错.不过由于PS2解析低的关系,我使用24C LCD 需要距离1.5米以上才能获得CRT电视般的效果(不然就可以看到色块和满屏的狗牙). 使用原生支持480P的游戏可以获得最好的效果(GT4,SO3DC,TK5,SC3… 尤其是SC3)  ,无论是色彩和细节都比电视卡好多了. 其次是用xploder HD 引导到480P , 效果要打折扣,而且不能满屏,部分游戏无法兼容. 不过<宇宙巡航机5>的效果出奇的好,画面令人陶醉. 此外主机输出模式要改为RGB ,不然画面就全绿了 ….     手机太滥了,无法屏摄,有机会再贴图.
 
 
 
 
 
奢侈一把,用了美国产的"怪兽"线,做工不错,和VGA接口严丝合缝,接头外壳含银,用来抗干扰
其实这个是for PS3 的,但用在PS2 上也没问题
 
 

SAP 锁机制简单分析

SAP 中的锁其实是一种逻辑锁(软锁) , 建立在DB层之上,但又和DB锁机制没有太大关系.
SAP component code : BC-CST-EQ
releated T-code : SM12 , SE11(maintain lock object)
releated Table : no (事实上所有关于lock的数据都是从SAP memery 中抓取的,并不存在物理表)
key words : enqueue , ABAP LUW , DB LUW , Exclusive/Share/LOCK , update task , Lock object
lock object 的用法
 
参数设定
 
 
lock type
 
 
值得注意的是Type S, 从这种锁可以看出,SAP的锁机制不仅仅是单纯用来保证数据完整,他会针对某个事务而设定锁。 为什么? 有人也许要问,type S和其他的本质上不都一样吗?反正锁了别人就改不了,用别的Type 也一样啊。呵呵如果这样想单纯从DB的观点看是正确的,但参照下图会发现当其他人去尝试再次提交lock请求与type s时会被拒绝,只有type s本身除外,恍然大悟,这些锁的区别只有在冲突发生时 结合具体的事务,他们的区别才能显现出来。
 
lock 冲突仲裁
 
 
reference code :
 
tables:ZUSER_INFO,MARC.
DATA: N LIKE ZUSER_INFO-BNAME.
N = ‘08090224’.
call function ‘ENQUEUE_EZUSER_INFO’
  EXPORTING
  MODE_ZUSER_INFO = ‘E’
  MANDT = SY-MANDT
  BNAME = N
  _scope = 3
  EXCEPTIONS FOREIGN_LOCK = 1
             SYSTEM_FAILURE = 2.
CASE SY-SUBRC.
  WHEN 0.
    WRITE: ‘OK’.
  WHEN 1.
    WRITE: ‘LOCKED’.
  WHEN 2.
    WRITE: ‘FAILED’.
ENDCASE.
call function ‘ENQUEUE_EZUSER_INFO’
  EXPORTING
  MODE_ZUSER_INFO = ‘E’
  MANDT = SY-MANDT
  BNAME = N
  _scope = 3
  EXCEPTIONS FOREIGN_LOCK = 1
             SYSTEM_FAILURE = 2.
CASE SY-SUBRC.
  WHEN 0.
    WRITE: ‘OK’.
  WHEN 1.
    WRITE: ‘LOCKED’.
  WHEN 2.
    WRITE: ‘FAILED’.
ENDCASE.
call function ‘DEQUEUE_EZUSER_INFO’
  EXPORTING
  MANDT = SY-MANDT
  BNAME = N.
call function ‘DEQUEUE_EZUSER_INFO’
  EXPORTING
  MANDT = SY-MANDT
  BNAME = N.
SELECT * FROM MARC WHERE MATNR = ‘1SDSAP00001’.    *无意义debug用
WRITE MARC-PSTAT.
ENDSELECT.

 

这段代码非常简单,演示了E type lock 的基本行为。当执行完第一个’ENQUEUE_EZUSER_INFO’ 时,用sm12 观察发现有lock 记录,当执行完第二个个’ENQUEUE_EZUSER_INFO’ 时不会出现第二个相同的lock记录,而是在该lock记录上加算一个lock,累计两个。同样,在’DEQUEUE_EZUSER_INFO’ 时候要按照相反的次序release lock.

加入把代码中lock type 设定为X ,则不会加算lock值.Type E 和X的差别也就在此。还有就是如果两次lock type为X的话第二次会报异常, 因为已经lock且不能重入。

 Type S 虽然没有说是否会加算,但事实上确实会去加算。

Type S和X 在DEQUEUE 后不会release (直到程序退出),感觉很奇怪,还要再思考一下。

 

 

 

to be continue……

SAP BG job 状态转移图

之前对SAP job 没有系统认识,尤其是copy 一只job后的状态,看下面的图应该就一目了然 。尤其是copy和change后的job状态

 

用python写了一个自动备份并压缩数据档的小脚本

下面两个小脚本可以实现文件备份压缩,写入log 并发送相关mail.
不足百行,条理清晰,运行效率高,避免了C# 这类高代价平台带来的依赖,以及效能问题.
 
#!/usr/bin/python
#coding:utf-8
#filename:backup.py
#function:backup files with data fold and time file
 
import commands
import time
import os
import bak_sendmail
source=’h:\s’  # file source
target=’h:\d’  # back destination
rarpath=’e:\winrar’ # location of winrar.exe
ndate=target+’\’+time.strftime(‘%Y%m%d’)
ntime=time.strftime(‘%H%M%S’)
npath = ndate + os.sep + ntime
if not os.path.exists(ndate):
    os.mkdir(ndate)
    print ‘Successfully created directory’, ndate
parm=npath+’ ‘+source
rar_command = rarpath+’\rar.exe u -r %s’ %(parm)+’ ‘+’>> %s.txt’ %(ndate)
print rar_command
if os.system(rar_command) == 0:
   print ‘Successful backup to’, ndate
   authInfo = {}
   authInfo[‘server’] = ‘qsmcfe’ #email server
   authInfo[‘user’] = ‘quantacn\ms2test’ #smtp user
   authInfo[‘password’] = ‘Qsmc+12345’ #smtp password
   fromAdd = ‘XXXXX@quantacn.com’  #email address from
   toAdd = [‘XXXXX@quantacn.com’]   #email address to
   subject = ‘backup_test’   #email title
   plainText = ‘test’      #email content plain text
   htmlText = ‘<B>备份已完成</B>’+"<font color=’#ff0000′>"+npath+’.rar’+"</color>"   #mail content htm text
   smail.sendEmail(authInfo, fromAdd, toAdd, subject, plainText, htmlText)
else:
   print ‘Backup FAILED’
 
 
#!/usr/bin/python
#coding:utf-8
#filename:bak_sendmail
#function:send mail with backup log
 
import email
import mimetypes
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
from email.MIMEImage import MIMEImage
import smtplib
def sendEmail(authInfo, fromAdd, toAdd, subject, plainText, htmlText):
        strFrom = fromAdd
        strTo = ‘; ‘.join(toAdd)
        server = authInfo.get(‘server’)
        user = authInfo.get(‘user’)
        passwd = authInfo.get(‘password’)
        if not (server and user and passwd) :
                print ‘incomplete login info, exit now’
                return
        msgRoot = MIMEMultipart(‘related’)
        msgRoot[‘Subject’] = subject
        msgRoot[‘From’] = strFrom
        msgRoot[‘To’] = strTo
#        msgRoot[‘To’]=toAdd
        msgRoot.preamble = ‘This is a multi-part message in MIME format.’
        # Encapsulate the plain and HTML versions of the message body in an
        # ‘alternative’ part, so message agents can decide which they want to display.
       
 msgAlternative = MIMEMultipart(‘alternative’)
        msgRoot.attach(msgAlternative)
#        msgText = MIMEText(plainText, ‘plain’, ‘utf-8’)
#        msgAlternative.attach(msgText)
        msgText = MIMEText(htmlText, ‘html’, ‘gb2312’)
        msgAlternative.attach(msgText)
        fp = open(‘cat_fish_bowl.jpg’, ‘rb’)
        msgImage = MIMEImage(fp.read())
        fp.close()
        msgImage.add_header(‘Content-ID’, ‘<image1>’)
        msgRoot.attach(msgImage)
        smtp = smtplib.SMTP()
        smtp.set_debuglevel(1)
        smtp.connect(server)
        smtp.login(user, passwd)
#        smtp.sendmail(strFrom, strTo, msgRoot.as_string())
 smtp.sendmail(strFrom, toAdd, msgRoot.as_string())
        smtp.quit()
        return