EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Heaven_1 于 2023-6-25 10:00 编辑 + D8 k: l2 E. e7 u
4 H2 F9 N( n; A9 [: U7 f, S2 H$ G$ `& x/ S; Y5 G
: \8 `1 m( l- H) ~. j+ ~
: p3 E9 s. L2 r0 V7 E. w随着科学技术的高速发展,FPGA在系统结构上为数字图像处理带来了新的契机。图像中的信息并行存在,因此可以并行对其施以相同的操作,使得图像处理的速度大大提高,这正好适合映射到FPGA架构中用硬件算法得以实现。 7 o; s3 k1 t2 {$ @ t5 E
本篇阐述了基于FPGA设计一个能够实时采集、实时处理并实时显示的数字图像处理系统的设计思想和流程,分析了摄像头接口的时序;阐述了图像信息的捕获原理;详细介绍了图像边缘检测部分各模块的功能;重点介绍了具有去噪功能的中值滤波模块的设计;简单描述了边缘检测算子的选用;系统的介绍了SDRAM的工作原理以及控制方式;介绍了VGA时序;最后针对整个系统做了验证和总结,包括仿真波形的验证以及板级验证。
; c0 t# u! e4 k) n5 j- g" r" \
该系统基于实体FPGA开发板实现了图像数据的实时采集、实时边缘检测和实时显示,运行稳定,实时性能较高,从而也表明FPGA确实具有海量数据高速传输的能力。
& k; P! I, F" g) S
本篇为本人当年的毕业设计部分整理,各位大侠可依据自己的需要进行阅读,参考学习。 ( V, |/ Y5 f4 w+ X
第一篇内容摘要:本篇会介绍前言,包括课题研究的背景和意义、相关技术在国内外的发展现状及应用、图像边缘检测技术的主要应用、FPGA技术在国内外的发展现状及应用、系统设计的主要内容及方案、系统的设计流程。
- _1 T) p$ q! G" o4 P% B* k
还会介绍基于FPGA实现图像的实时采集部分,包括图像信息的实时采集,摄像头型号及其参数,SCCB总线特点及其工作原理,基于FPGA驱动摄像头接口,图像信息的实时捕获等相关内容。 0 `, _: t# @3 g# P+ g) x
一、前言
) u6 N. ]" R& |( a' c k
1.1 课题研究的背景和意义
% j3 N" Z( j" j5 r/ Z: w
信息化是本世纪最主要的特征之一,在这样一个信息化的时代,计算机显得尤为重要,在各行各业都起着举足轻重的作用。在图像处理领域,数字图像处理技术发展得尤为迅速,并广泛应用于航空航天、电子通信、医学等各个领域,随着技术的不断发展,新开发的产品在图像质量、图像存储容量以及图像处理速度等方面也都有了新的需求。数字图像处理,往往是基于像素进行一些运算,从而有效提高图像质量。在图像处理过程中,处理算法往往比较简单,然而由于参与运算的图像数据量大,大多数图像数据还需要多次重复使用,因此图像处理的速度便成为了整个系统设计的瓶颈。 6 ~7 V, R/ b& _: N' k" n5 h. s
目前,图像处理的算法研究已经日趋成熟,在这种背景下,有效提高图像处理的时效性,解决实际系统设计的瓶颈问题,便有了很大的应用前景。随着科学技术的高速发展,FPGA在系统结构上为数字图像处理带来了新的契机。图像中的信息并行存在,因此可以并行对其施以相同的操作,使得图像处理的速度大大提高,这正好适合映射到FPGA架构中用硬件算法得以实现。
7 o2 L+ E0 r8 ~5 U: c7 }
数字图像处理技术包括图像增强、图像复原、模式识别等,图像中亮度变化明显的点可能就是边缘点,能够有效地检测出图像的边缘,将对图像的后续处理起到事半功倍的作用。通过边缘检测过程,我们可以保留图像中对象的边界信息,这在很大程度上减少了待处理的数据量,从而有效简化了图像的分析过程。
; U% ?6 d& r# W) M" g$ d O
FPGA结构灵活、现场可编程、并行处理信息,兼顾速度和灵活性。另外,其通用性强、适于模块化设计、易于维护和扩展、开发周期较短,适合用来做实时图像处理。因此,基于FPGA设计一个基于VGA实时显示图像边缘检测信息的系统有着广泛的应用前景和深远的现实意义。 2 h$ ?* L2 o) Q4 N/ j% M, t
1.2 相关技术在国内外的发展现状及应用 . {% n% A# N6 \- m {$ Q4 F2 d& @# S
1.2.1 图像边缘检测技术的主要应用 ! h( N( {+ J9 X- O8 d
1)边缘检测在储粮害虫方面的应用 ' |0 C' k4 K0 k1 z
农业是我国的主要根基,虫害是储粮的大敌,近年来,对储粮产生威胁的害虫种类和密度均呈上升趋势,导致国家的储粮损失日益严重。为了降低储粮损失,有效防治害虫,就必须要尽可能准的分析它们的种类、数量、发展趋势及其潜在危害。利用计算机实时采集储粮害虫的相关图像、数字化处理、分析识别,自动提取储粮害虫的种类、数量等相关信息,并由计算机系统输出数据、发出指令,这就构成了当今的科学保粮专家系统。基于机器视觉实时监测虫害信息并智能化处理是虫情检测的发展趋势,虫害图像处理算法则是关键核心问题,其中,图像的边缘检测技术起到了非常关键的作用。
) R. p2 i. [8 |5 C! @. e% I
2)图像边缘检测技术在电厂中的应用
- x J! O1 P* R, j8 d/ n5 g
在电厂中,其安全和经济运行主要取决于其锅炉燃烧的稳定性。20世纪80年代,出现了一种将计算机技术、数字图像处理技术以及燃烧学等技术相结合应用的跨学科技术——锅炉图像火检技术。其原理是利用计算机分析火焰图像,从而得到关于炉内运行情况的大量原始信息。利用计算机对火焰图像进行数字处理,提取火焰亮度均值、火焰燃烧中心以及火焰锋面位置等参数,从而分析描述炉内燃烧的整体水平、火焰中心位置以及火焰充满程度等信息。该技术的核心之一就是图像边缘检测技术。
. k/ x4 l* _) `) t/ l* t8 `1 @* q
目前,边缘检测技术已渗透到各个领域,例如医学细胞检测领域、产品外观检测领域、模式识别领域等。 ( K2 ]# W) C5 u& Y3 z. q
1.2.2 FPGA技术在国内外的发展现状及应用 * I) N. ~( s' M @
FPGA即现场可编程门阵列(Field-Programmable Gate Array),是当前用于IC设计的主流形式之一,具有近乎完美的现场编程架构,极具发展潜力。FPGA所能实现的数据流的高速传输性能是目前没有任何技术能够与之抗衡的,在这个处处都追求速度的社会,FPGA几乎无处不在。随着信息产业和微电子技术的发展,可编程逻辑嵌入式系统设计技术已经成为信息产业最热门的技术之一,应用范围遍及航空航天、医疗、通讯、网络通讯、安防、 广播、汽车电子、工业、消费类市场、测量测试等多个热门领域。2008年北京奥运会的主舞台中——画卷就用到了4000个FPGA芯片,这是FPGA在图像领域中的应用;FPGA在人脸、车牌等物体检测中得到了广泛应用,航空航天领域中导弹轨迹的实时监测也少不了它;奥迪选择了两个FPGA芯片用于它的导航定位系统,这是FPGA在汽车电子领域中的应用。
7 u# _8 ^" Y1 B# {/ ]' d N
FPGA最主要的优势有四点:①FPGA用硬件描述语言(VHDL或Verilog)进行描述,并发执行,除此之外,FPGA内部集成锁相环,可以把外部时钟倍频,核心频率可高达几百兆,在高速领域,FPGA无法被取代;②FPGA可现场编程,具有近乎完美的现场编程架构,可根据用户需求实现定制;③基于FPGA可以实现SOC的设计(内部集成ARM);④FPGA可以内嵌CPU,甚至可以嵌入多核。 1 n( B* y: W9 D f: x, w$ t. }/ _1 U
' D9 f' h F. t) `/ o随着科技的发展,人们对数字图像处理技术的要求也越来越苛刻,FPGA具有高速运算、微型体积、较低功耗等诸多优点,这使得FPGA技术在数字图像处理领域中必将起着不可替代的作用。 ! d5 ?+ D. S2 p' e6 ?. m( r: L4 o& ?
1.3 课题研究的主要内容及方案
0 V& p+ t0 y3 g& w' C
1.3.1 题研究的主要内容 " c' M* Z1 _; z: p% |
21世纪是一个高速的信息时代,在众多信息中,图像类信息是其中的一大类,对图像信息实时、高速、准确的处理一直都是学者们研究的一大热点。图像处理一般指数字图像处理:就其技术本身而言,包括图像增强、图像复原、图像匹配、模式识别等,无论是那一种技术,都脱离不开同一个话题——图像边缘检测,换言之,图像处理技术的好坏很大程度上就取决于是否能够对图像边缘的信息处理妥当;就其处理形式而言,包括静态处理和实时处理,所谓图像的静态处理,就是对静态图像的处理,而实时的图像处理,就是对持续更新的图像信息进行处理。 % C2 G- W! U) T* q- s3 j
本课题研究的主要内容就是基于VGA实时显示由摄像头所捕获图像的边缘信息,整个系统设计基于FPGA实现:首先是基于FPGA实现图像数据的实时采集;接着对捕获到的信息进行边缘检测,这里分为三步完成(先是将捕获到的彩色图像转换成为亮度文件,接着采用中值滤波对图像进行有效去噪,然后采用sobel算子对图像进行边缘检测);最后基于FPGA驱动VGA接口实时显示检测得到的图像边缘信息。
1 L4 x( P% t3 v1 Q2 n+ J- W% f
1.3.2 系统的设计流程
- |9 B$ S4 N- ?; p& a; } / N! r. u) d Q! ~) U
本课题基于FPGA实现,主要涉及到以下内容: 1、摄像头接口的驱动; 2、图像数据的实时捕获; 3、彩色图像到灰度图像的转换; 4、中值滤波; 5、边缘检测; 6、图像数据实时存储; 7、图像信息实时显示。具体设计流程如图1-1所示。
) N2 k$ Y8 t- c1 p
! S' [2 D7 E* F0 o
2 T* ~, h. p) d0 H( M: j) J
二、基于FPGA实现图像的实时采集
/ F; C7 R' N4 C; Z' x0 H$ }2.1 图像信息的实时采集
2 {3 i# V1 c& b/ j
2.1.1 摄像头型号及其参数 . p, {8 l# m7 P, x) d7 U
人对视觉的感知往往以图像的形式再现,图像可以由光学设备获取,也可以由人为创作。随着数字采集技术和处理技术的发展,越来越多的图像以数字形式存储,即数字图像。数字图像以二维数字组的形式表示,用数值表示各像素灰度值的集合,用来表示图像的数据体称为图像数据。数字图像处理的过程就是利用计算机对获取的图像数据进行去噪、增强、特征提取的过程。本课题的主要任务就是实现图像的实时采集、实时处理并实时显示,因此我们的首要任务就是实现图像的实时采集,这里我选用摄像头作为我获取图像的设备,基于FPGA按照相应的时序驱动摄像头接口。 _. J# |1 c# v9 [% J9 j& t2 L6 L
本系统选用由豪威公司生产的Ov7725 CMOS Sensor摄像头进行设计和调试。Ov7725 属于VGA分辨率的CMOS Sensor,其分辨率最高达640*480,成像质量优越,功耗小,开发简单,受到很多中低端产品的青睐。Ov7725是一款集成1/4英寸单芯片VGA相机及图像处理器的高性能传感器。由于该型号摄像头的质量和性能可靠,因此在PC相机、玩具、手机等众多移动产品中均有诸多应用。 ( d4 N4 b8 o% ?& ?4 l! r) N, n' T
1)Ov7725 CMOS Sensor摄像头的参数及特点 (1)图像饱和度、锐度、噪声抑制等可调节; (2)自动调节边缘的增强与衰弱,自动调节噪声的抑制; (3)具有标准的SCCB(相机控制总线)接口,可以配置输出 RAW RGB、RGB422、RGB565、RGB444、YUV422等格式的视频流; (4)支持VGA、QVGA以及40*30到CIF(352*288)分辨率的图像尺寸; (5)能通过配置实现帧同步模式; (6)高灵敏度,适合低照度使用; (7)自动曝光(AEC)、自动白平衡(AWB)、自动带通滤波(ABF)、自动黑白电平校准(ABLC); (8)拥有640*480的感光阵列,最高支持640*480@60hz图像输出。 - J n+ Z+ _; d$ q- N& s
2)Ov7725 CMOS Sensor摄像头的内部功能模块框架与说明 ! J# V; G1 f/ Q( d4 W1 U
2 F M% K" i6 G! y8 x _' y1 ^% G
# l: x* Z2 H. N- ?/ w, ~
图2-1 Ov7725 CMOS Sensor 内部模块框架 1 ~- S+ F* ]# h. ?( N0 {4 d' e
如图2-1所示为Ov7725 CMOS Sensor摄像头的内部模块框架,从框架中可以看出,我们可以通过SCCB接口来配置Ov7725的寄存器。其工作原理如下:在XCLK的驱动下,首先由感光元件阵列进行相关图像的采样,并默认输出640*480阵列的原始模拟数据;然后通过12bit的A/D转换,将原始模拟数据转换成为数字信号(原始数字信号格式为 RAW RGB);最后通过DSP进行相关的算法处理,并最终输出10bit 视频流数据。 2 c6 g: ?( W$ R4 d9 X4 w
3)Ov7725传感器的控制信号接口及其功能描述
4 Z) M" q$ o8 H- P; g0 V( J- z
$ L+ Z5 [1 E* @: v9 [表2-1 Ov7725传感器控制信号的功能描述 * |3 n2 L) Z! ]' ^9 D- ]
# |0 ^+ s; o* x/ ^. r
: f7 a& G7 Y+ b2 R/ k0 w) g+ B
0 s5 K2 i" H6 o3 A( H9 L& c! W) _6 B6 Z
4)Ov7725传感器的寄存器说明 - A. ~% R9 a: L3 r/ M
4 L7 I9 r% s( m4 c. i! d
4 f) l3 V4 ^& K% B( R, {
% ]3 Q$ k4 W4 BOv7725 CMOS Sensor一共有172个配置寄存器,在这172个寄存器中,有的只能读,有的只能写,有的则既可读又可写。在传感器正式工作之前,必须首先对寄存器进行正确的配置,否则将无法得到预期的工作模式,更别说得到较好的画质和相应的图像效果。然而这172个寄存器并非都需要我们配置,需要我们配置的只是个别重要的寄存器。其配置的方式就是通过SCCB总线进行相关操作,其余寄存器则采用默认值。表2-2中所介绍的寄存器主要与视频图像输出格式、采样画质、曝光参数等有关。
% v4 ?& u. \+ Y# U& {
表2-2 Ov7725传感器的寄存器介绍 , v, X; @ D( L; x8 L9 x
* P6 n y6 J5 q- }( o* C
3 I Y) T& Q" V: x
5 I! o) X/ k; d$ A' ~8 l
6 _- h$ h g0 u* u! ]- j' m/ r1 ~/ y5 e
2.1.2 SCCB总线特点及其工作原理 9 b$ ]4 U/ T' s: s
1)SCCB总线特点 % ~0 s9 }& Q+ T& b; ~4 P0 f
SCCB(Serial Camera Control Bus)接口,即串行相机控制总线。Ov7725的SCCB总线实际上就是我们常用的IIC通信总线,用于完成对绝大多数OmniVision 系列图像传芯片功能的控制。Ov7725的SCCB接口有两根信号线:一根是时钟线SCL;一根是数据线SDA。通过这两根线我们就能够完成Ov7725寄存器的配置,从而驱动Ov7725使其实时采集到我们所需要的图像信息。 ; |; I/ r% y5 h+ J$ x" O2 D
SCCB总线的控制方式简单,通信速率较高,具有以下特点: (1)SCCB总线只需要两根线,一根数据线SDA,一根时钟线SCL; (2)SCCB总线不需要片选信号就可以实现多个设备的链接,可以通过从机的唯一地址识别码来访问,最终实现器件信息的配置; (3)SCCB总线上的所有器件都具有“自动应答”功能,从而保证了数据交换的正确性。同时SCCB总线还具有“时钟同步”功能,其时钟频率最大约为400KHz。 2) SCCB总线的接口时序 SCCB总线是由数据线SDA和时钟线SCL构成的串行总线,可以实现数据的发送和接收,SCCB总线的体系结构如图2-2所示。 ' K' E9 l+ Q8 w# b$ [" M
+ o$ b) c1 N6 ]7 G4 m% J- _; e+ p3 s/ N6 T+ A$ \
5 ], C a: M% ?- i" j+ A3 h' E# {
图2-2 SCCB总线的体系结构 ' C3 X1 M; R9 H
SCCB总线通过串行方式发送8位数据,基本时序如下:首先发送数据的最高位,最后发送数据的最低位;每发送完一组8bit的数据,都需要通过接收从机发送的一个响应信号来判断本次发送数据是否正确。官方手册所提供的使用SCCB总线发送8位串行数据的时序如图2-3所示,其中信号SCCB_E不需要我们关心。
0 K% n T3 \" {' [! G; C8 i. V6 `9 |% G0 O, h* W3 L& B
- A8 l( r: Q" {) h" s图2-3 SCCB总线8bit数据串行发送的时序图
5 j- P: R. E/ B4 u ' y' j+ L N) c8 v3 t% P' o. h
在我们按照SCCB协议发送或接收数据时,需要特别注意以下几点: 2 X. v2 A1 W. y) H" u
(1)开始信号和结束信号 6 b3 p. ]9 K5 [) n M! F; M
当时钟信号SCL为高电平时,数据线SDA由高电平跳变到低电平的时刻即为开始信号,自此时起数据开始传输;当时钟信号SCL为高电平时,数据线SDA由低电平跳变到高电平的时刻即为结束信号,数据传输在此时结束。SCCB总线的开始信号和结束信号的体系结构示意图如图2-4所示。 , }* R7 G$ `5 @5 G2 O& E+ X
, g0 B9 u, S) B s3 E6 q* H! ?
! w2 i0 y6 t/ d6 D2 u( P
图2-4 SCCB总线开始和结束体系结构 / o* a) n7 O5 D3 X5 X9 v/ ^
(2)应答信号ACK 2 i4 K& G z3 d! U
2 f; B* v! V6 ^: c每8位数据发送完毕之后,外围设备向发送数据的控制器(FPGA芯片)发出低电平应答信号表示已经接收到数据,这个信号叫做应答信号。控制器(FPGA芯片)接收到应答信号之后,会据此判断并作出是否继续传递信号的决定。如果控制器(FPGA芯片)没有接收到应答信号,控制器就会认为是受控制的外围设备出现故障,因此需要重新进行配置,直到成功接收到外围设备所发出的正确的应答信号。SCCB总线应答信号ACK如图2-5所示。 6 `3 o% w8 x- O
! C& M1 H I- S6 [4 U. F: Y/ E* o
; c7 O9 Y" E+ k1 L/ ]1 N
图2-5 SCCB总线数据传输图 5 n. \0 O2 T2 ?9 n0 K* H, Y
) _' f m3 X7 w: w5 B! X
(3)数据传输 . k( k4 ^2 G1 O+ x
6 J" a7 n$ _1 d4 j" v1 R6 }' T5 L
SCCB总线在进行数据传输时,时钟信号SCL为高电平,同时数据线SDA上的数据必须保持稳定,只有这样才能够保证所传输数据的稳定性和可靠性。因此只有当时钟信号为低电平时,数据线上的高电平信号或者低电平信号才允许变化。SCCB总线数据传输图如图2-6所示。 7 _5 C# G/ A, c$ E
) |/ x. c! t. h2 q# Z9 V
: J" T: \4 V5 Q) m1 V
# h; v% {: I: q ~) ]
5 p( D+ K9 z/ }* U! Y, A
5 j$ e$ k/ G" O/ _
图2-6 SCCB总线数据传输图3)使用 SCCB总线配置Ov7725的寄存器 6 r* H. P- U* K. x
基于上述的分析,我们对SCCB总线时序已经有了一定的了解,接下来就可以按照指定的流程来配置Ov7725的寄存器:通过发送器件地址、寄存器地址、寄存器参数数据等参数的配置,最终完成寄存器的读操作和写操作。 8 v! q+ S k) {& s+ }* {. i8 d
(1)SCCB总线寄存器的写入时序 SCCB总线在给寄存器写数据的时候,需要按照一个严格的时序来执行:先写设备地址,再写寄存器地址,最后写入寄存器的参数,即可完成一个寄存器的配置,如图2-7所示。
2 M- e9 f @" @' v Z- C/ J( Q1 w
1 |! M S* g) n5 ^* T# }
1 B: N% `; @ Z, E; @4 c ?5 a% \; u9 |8 k
Phase 1:CMOS传感器的唯一ID地址。豪威(OmniVision)相机的设备地址是0x42,最后1bit是用来判断读/写的:写数据时ID地址是0x42,而读数据时ID地址是0x43; Phase 2:传感器里面有许多的寄存器,这些寄存器都有着自己唯一的地址,这里我们只关心Sub-address; Phase 3:在Phase中发送完寄存器的地址之后,该阶段发送的数据就是寄存器的配置数据。 由官网手册可以知道这里面的X代表低电平,也就是逻辑“0”。
4 K0 X1 f$ P4 x1 k. C( e# w(2)SCCB总线寄存器的读数据时序
6 w, n4 G5 h/ ]5 W+ H& l% _SCCB总线从寄存器往外读数据的时候,也需要遵循一个严格的顺序:先写设备地址,再写寄存器地址,然后再写入一次设备地址,最后读出数据。读数据的时序如图2-8所示。
9 ^ o; A$ d0 ]1 c6 v, j& l& V7 M, S G g
$ y |2 z s- ?% Z
* s5 L% B' C# r
0 E1 ~( Z3 S$ b, v) n" c
4 u8 @# v+ E0 Z0 {7 y5 D# FSCCB读数据时序
6 z* j* ^8 u7 n2 |) w8 Q1 PPhase 1:CMOS传感器的唯一ID地址。豪威(OmniVision)相机的设备地址是0x42,最后1bit是用来判断读/写的,即写数据时ID地址是0x42; Phase 2:传感器里面有许多的寄存器,这些寄存器都有着自己唯一的地址,这里我们只关心Sub-address; Phase 3:CMOS 传感器的唯一ID地址。豪威(OmniVision)相机的设备地址是0x42,最后1bit是用来判断读/写的,即读数据时ID地址是0x43; Phase 4:读取传感器发送的指定的寄存器的值。 由官网手册可以知道这里面的X代表低电平,也就是逻辑“0”,NA表示高电平,也就是逻辑“1”。 ' b9 B6 D: }& X; Q" ]& J
2.1.3 基于FPGA驱动摄像头接口
' r% k B* K: s, T% r) Z& F理解了SCCB总线的时序,我们就可以按照相应的时序编写控制代码,如图2-9所示为工程RTL级视图中的sccb_config_ctrl模块,其功能是实现摄像头接口的驱动,该模块代码及说明见附录。 ( {& h z' @' G% V6 c4 g) u
! }2 @$ Z1 F: X* t7 a/ f% E, T) {; m
图2-9 工程RTL级视图中的sccb_config_ctrl模块
& {! _, [5 n! F, c8 k. ^+ E" D$ p8 j1 g) ~% ~, c p
2.2 图像信息的实时捕获等相关内容
. @2 W7 B1 r3 w/ \+ q* W/ `" Z$ c: W9 O2 d3 f7 A$ ]+ g2 T
通过摄像头的采集,我们得到了视频数据流,但是我们所要处理的是单帧的图像数据,因此需要实时捕获数据流中的图像数据,为后续的图像处理做准备。如图2-10所示为工程RTL级视图中的coms_capture_rgb565模块,其功能是实现图像信息的实时捕获,该模块代码及说明见附录。 . M7 F4 O5 [1 O* S$ m
+ j ~4 }' ]7 F* `' m4 I! I9 B6 U' J
! o& e1 Y5 B( z$ h" B" S
图2-10 工程RTL级视图中的coms_capture_rgb565模块 b5 u; i G1 q" S1 [3 N
1 }" N$ Q. ~6 ^' V5 a3 H+ t) A本篇到此结束,下一篇带来基于FPGA的实时图像边缘检测系统设计(中),介绍FPGA实现图像的边缘检测模块及FPGA驱动VGA接口实现图像边缘信息的实时显示模块相关内容。 + R# e8 [9 }: V: N" u5 J9 T) k
0 t: f; N$ \. v0 W0 h: S5 Y
2 Y1 F! s( |; K2 m) P& g
1 H* ]: |" Y# x |