Abstract:
An object oriented n-dimensional signal object store and processing array structure to enable efficient processing of n-dimensional signal data, including: a fast n-dimensional signal storage memory capable of rapidly storing and accessing n-dimensional signal objects, a multi-level mass memory structure to store massive amounts of data before transferring to the fast n-dimensional signal storage memory, and an n-dimensional signal processor array to process the n-dimensional signal object data in the n-dimensional singal object store.

Description:
CROSS-REFERENCE TO RELATED APPLICATIONS  
       [0001]    This application claims priority from a U.S. provisional patent application, Ser. No. 60/480,985, filed on Jun. 23, 2003, entitled “Method and Apparatus for Adaptive Multiple-Dimensional Signal Sequences Encoding/Decoding,” which is hereby incorporated by reference. This application is related to a co-pending U.S. utility patent application, filed on Jun. 14, 2004, entitled “Method and Apparatus for Adaptive Multiple-Dimensional Signal Sequences Encoding/Decoding,” which is hereby incorporated by reference. 
     
    
     
       BACKGROUND OF THE INVENTION  
         [0002]    1. Field of the Invention  
           [0003]    This disclosure relates generally to data encoding, storage, distribution, and decoding, and more particularly to a memory and array signal processing structure to process the n-dimensional signal sequence.  
           [0004]    2. Description of the Prior Art  
           [0005]    Digital data systems are frequently challenged to handle large quantities of data quickly enough to meet practical needs. Compact disc music requires about 1500 kilobits per second, and video needs over 200,000 kilobits per second. Both transmission and storage of data is costly, and in some cases impossible. For example, a current telephone line modem can only carry maximum bit rate at 56 kilobits per second with a perfect line condition. Although video image frames need only be handled at approximately 30 cycles per second in order to allow an observer to have the impression of continual image transmission, the data content of each image frame is very large.  
           [0006]    Solutions to the problem of quickly handling large quantities of data have been developed by using methods of data compression, i.e., methods of reducing the quantity of bits required. Data compression has made possible technological developments including digital television, DVD movie, streaming Internet video, home digital photography and video conferencing. Compressing coders and decoders (CODECs) are used to encode (at the capturing/production side) and decode (at the receiving/reproduction side) data containing statistical redundancy.  
           [0007]    [0007]FIG. 1A is a simplified block diagram describing a prior art system for compressing image sequence data with an encoder  1 . An image frame  4  is provided as input to the encoder  1  and the data is encoded. The encoded frame is then transmitted, and a copy of the encoded frame is decoded at the decoder  10  and stored as a reference frame  6  in the frame buffer  3 . With the current input image frame  4  as input, the encoder  1  then searches the reference frame  6  for a closest match point in the reference frame  6  for each block of a plurality of blocks that make up the current frame. This includes the use of a motion estimator (ME)  5 , and requires a calculation of what is called an “energy difference” measure, such as sum of square error or sum of absolute error between the current frame block and corresponding reference frame block located at each search point in the reference frame. The best match location is then represented as a “motion vector”  7 , specifying the two-dimensional location displacement of the block in the reference frame  6  relative to the corresponding block in the current frame. Also, the difference (residue)  8  between the best match block in the reference frame  6  and the current image input frame  4  is determined and is typically called the “Residue” or “Block Prediction Difference” (BPD). Both the motion vector  7  and the residue  8  are then encoded and transmitted. The encoder  1  will then decode the motion vector  7  and residue  8  and reconstruct the current frame in the same way that a decoder receiving the same data would reconstruct the frame, and then store this frame as a reference frame.  
           [0008]    A very significant issue is the amount of computational power that is required by an encoder in accomplishing the task of finding the best match for each block in the current frame, i.e., determining the displacement vector (motion vector) such that the displacement block in the reference frame is most “similar” to the current block. One prior art method of performing this task involves searching every possible location for block matching within a pre-defined search area. This method requires astronomical computing power and is not feasible for practical real time implementation. There are many simplified methods to search a fraction of the large and complete search space to reduce the computation cost. However, even with the reduced computing cycles, the data access is still the major bottleneck for system performance throughput. This is especially true for multi-dimensional data (2D for images, and 3D for video with multiple frame considerations) that need to be rapidly accessed in a selected pattern.  
         SUMMARY OF THE INVENTION  
         [0009]    The present invention is a memory organization and processing array structure to enable efficient processing of n-dimensional signal frames, including: an n-dimensional object store capable of rapidly storing and accessing of n-dimensional objects, the n-dimensional object store could optionally include a multi-level mass memory structure to store massive amount of data economically, and a signal processor array to process the data in the n-dimensional object store. Embodiments of the invention can be used to encode general n-dimensional signal sequences, such as one-dimensional, two-dimensional, and three-dimensional signals. One important application of this method is in video encoding for transmission and storage purposes. Because of this, in many of the descriptions below the two-dimensional video signal sequence compression is illustrated. However, the method and apparatus taught here can be extended to compress a general sequence of n-dimensional signals, where n is a positive integer.  
           [0010]    A first aspect of the invention is directed to an objected oriented memory organization and processing array structure to enable efficient processing of n-dimensional signal frames. The system includes: an n-dimensional object store capable of rapidly storing and accessing blocks of n-dimensional signals, a multi-level mass memory structure to store a large amount of data before the transfer to the n-dimensional memory, and a signal processor array to process the data in the n-dimensional memory.  
           [0011]    A second aspect of the invention is directed to an n-dimensional signal processing array to process n-dimensional data inputs. The processing array includes: an array of signal processing units; a group of data registers, to store the data for the signal processing units; and means for controlling the processing array to allow one data element to be used by more than one processor in the array.  
           [0012]    A third aspect of the invention is directed to a method to operate a n-dimensional memory system for storing and retrieving n-dimensional data in an n-dimensional frame. The method includes: storing one data item into each slice of L memory slices, where L is a positive integer; organizing the n-dimensional data to allow all the data in a given cube, which can be located anywhere in the frame, to be accessed in M=B/L cycles, where B is the total number of points inside the cube; accessing the data from the L memory slices based on n-dimensional address inputs from an addressing translation module; and providing data flow from the L-slices through a data multiplexer and data de-multiplexer to outside processing modules using the n-dimensional data.  
           [0013]    A fourth aspect of the invention is directed to a method to operate a two-dimensional memory system for storing and retrieving two-dimensional data in a two-dimensional frame. The method includes: storing one data item into each slice of L memory slices, where L is a positive integer; organizing the two-dimensional data to allow all the data in a given cube, which can be located anywhere in the frame, to be accessed in M=B/L cycles, where B is the total number of points inside the cube; accessing the data from the L memory slices based on two-dimensional address inputs from an addressing translation module; and providing data flow from the L-slices through a data multiplexer and data de-multiplexer to outside processing modules using the two-dimensional data. 
       
    
    
     BRIEF DESCRIPTION OF THE DRAWINGS  
       [0014]    [0014]FIG. 1A illustrates a data compression system, in accordance with the prior art.  
         [0015]    [0015]FIG. 1B illustrates a preferred embodiment of a system of the present invention for storage and processing of multi-dimensional signal data.  
         [0016]    [0016]FIG. 1C illustrates a 2-dimensional application of the invention to video data arranged in a 2-dimensional frame, in accordance with one embodiment of the present invention.  
         [0017]    [0017]FIG. 2 illustrates a block diagram of 2-level memory for n-dimensional storage, in accordance with one embodiment of the invention.  
         [0018]    [0018]FIG. 3 illustrates allocation of data for a two-dimensional 3×4 block from a frame, in accordance with one embodiment of the invention.  
         [0019]    [0019]FIG. 4 illustrates allocation of data for a two-dimensional 3×4 block from a frame, in accordance with an alternative embodiment of the invention.  
         [0020]    [0020]FIG. 5 illustrates a frame buffer data allocation pattern in an SDRAM, in accordance with one embodiment of the invention.  
         [0021]    [0021]FIG. 6 illustrates the order of arrangement of pixel data within one block, in accordance with one embodiment of the invention.  
         [0022]    [0022]FIG. 7 illustrates a 2-dimensional array implementation of the n dimensional processing engine, in accordance with one embodiment of the invention.  
         [0023]    [0023]FIG. 8 shows a spiral search with a step size of 4 pixels, in accordance with one embodiment of the invention.  
         [0024]    [0024]FIG. 9 shows a parallel spiral pattern with P search points in parallel, in accordance with one embodiment of the invention.  
         [0025]    [0025]FIG. 10 illustrates the method of data sharing with 3×3 array of processing units, in accordance with one embodiment of the invention.  
         [0026]    [0026]FIG. 11 illustrates a memory access example, in accordance with one embodiment of the invention. 
     
    
     DETAILED DESCRIPTION OF THE PREFERRED EMBODIMENT  
       [0027]    N-Dimensional Object Store (NDOS)  
         [0028]    The implementation of block matching and motion estimation typically has a bottleneck at accessing the blocks from any location in the reference frames. With the video streams typically organized in 2-dimensional or 3-dimensional objects in video algorithms, the use of 1-dimensional linear addressing based memory does not provide efficient results.  
         [0029]    To address this problem, what we need is some kind of specially organized memory data organization and processor structure to handle some special data access and processing requirements in the n-dimensional signal space efficiently with high throughput. Special memory organization and processing methods to address data access throughput issues for some space oriented data requests are known. For example, U.S. Pat. No. 5,818,726, entitled  System and Method for Determining Acceptable Logic Cell Locations and Generating a Legal Location Structure , by Tsu-Chang Lee, issued on Oct. 6th, 1998, demonstrates the solution of the layout placement location searching problem with a special organized cell array structure and processing method to achieve very rapid IC placement data throughput. The method taught in that patent enabled the placement of multi-million gate designs with data throughput more than 100 times faster than prior methods without a special memory structure. The present invention is a different application of similar concepts taught in that IC placement patent, to solve the n-dimensional encoding and decoding signal processing problems.  
         [0030]    [0030]FIG. 1B shows a preferred embodiment of this invention. The invention includes applying an “object oriented” principle as used in software design to organize the data and processor structure to solve the encoding and decoding signal processing problems. There are three main components in the encoding and decoding memory/processing system shown in FIG. 1B. The n dimensional encoding decoding object store (NDOS)  108 , organizes and stores the n dimensional signal data in the encoding and decoding space to support high throughput processing for encoding and decoding data processing. Since there is large volume of data to be stored in the encoding and decoding signal data store,  108  can in alternative embodiments be organized according to a hierarchical structure. Inside NDOS  108 , the encoding and decoding (n dimensional: N-D) signal data is stored in a general mass storage memory (NDMS)  103 . A chunk of locally used encoding and decoding signal data is decomposed and organized into a fast n dimensional objected oriented n dimensional (N-D) signal storage memory (NDFS)  102 . The NDFS  102  functions as a cache to provide data with high throughput to serve encoding and decoding data requests from the encoding and decoding signal processing engine  101 . Since most of the encoding and decoding signal processing follows some kind of pre-defined “navigation” pattern through the encoding and decoding space, the encoding and decoding data can be pre-loaded into the NDFS  102  from the NDMS  103  through the mass storage bus  109  with some amount of pipelining control (for example, the spiral searching pattern for ME search and the neighborhood preserving scanning pattern described in the co-pending U.S. utility patent application, filed on Jun. 11, 2004, entitled “Method and Apparatus for Adaptive Multiple-Dimensional Signal Sequences Encoding/Decoding,” are two example space data access cases.)  
         [0031]    The n dimensional (N-D) signal processing engine (NDPE)  101  requests the data through the encoding and decoding (N-D) object access bus  105  to request N-D “objects” from the NDOS  108 . Note here that the requested N-D objects are “higher level” meaningful items to the n dimensional encoding decoding signal processing systems compared to the low level bits and bytes in the traditional data access from traditional memory. In other words, the NDOS  108  “understands” the data processing applications and some semantics of the data. The N-D objects requested from the NDOS  108  will be stored in a data register in the NDRF  104  associated with the NDPE  101 . NDRF  104  contains registers (may include data, control, and system status) to be used by the NDPE  101  directly. The data transfer between the NDOS  108 , NDPE  101 , and NDRF  104  is through a very high speed N-D data bus (NDDB)  106 .  
         [0032]    NDOS Implementation  
         [0033]    As a specific implementation of the preferred embodiment specified above, details follow below for constructing an object oriented n-dimensional memory store, based on a traditional 1-dimensional addressing based memory to optimize the memory access efficiency and access pattern flexibility for ME algorithm frame buffer accessing. However, the use of this structure is not limited to the ME algorithm. Any n-dimensional data processing can use this mechanism for the flexibility and efficiency advantages.  
         [0034]    This memory access problem is illustrated in FIG. 1C. A 2-dimensional case in FIG. 1C is illustrated as an example, in the ME algorithm. In a video application, video data is typically arranged in a 2-dimensional “frame”  131  which shows a picture at any instance on the TV screen. Inside the frame  131 , the data is typically organized in a smaller 2-dimensional blocks  133 . These blocks  133  are usually have a size of 16×16 or 8×8 pixels, but can have other configurations. These blocks  133  are formed with a fixed grid pattern  132  on each frame.  
         [0035]    Video algorithms need to access these blocks in a very efficient way, e.g. get all pixels in a block in one single cycle or one single burst of cycles. Furthermore, video algorithms need to access a 2-dimsional block at any random location not aligned to the fixed grid  133 , as shown in FIG. 1C.  
         [0036]    Currently, electronic memories (SDRAM, SRAM, etc.) are organized in a 1-dimensional based addressing mechanism that allows at best a simultaneous access/burst of pixels in a linear way, i.e., a row of pixels. With some pre-arrangement of the pixel data allocation in the memory, it is possible to burst access a block aligned to the fixed grid pattern in the frame. However, it is not possible to allow access in one cycle/burst of a random located block. One embodiment of the invention provides a structure to solve this problem.  
         [0037]    [0037]FIG. 2 shows a specific embodiment of the general N-D object oriented memory structure shown in FIG. 1B. In this block diagram, the n-dimensional object memory  102  is separated into L slices. Each of the memory slices is a traditional 1-dimensional memory (e.g., SRAM). The data width of each slice is the minimal element size of the object. In video, this size is a pixel (e.g., 8 bits). In other applications, the bus width of the memory slice can be any size. The goal of the L-slice organization is to allow the access of an n-dimensional block in one cycle (if the data block has L elements), or in a burst of multiple access cycles with L elements each. To achieve this, the major issue is how the n-dimensional block data allocated into the L slices. There are two criteria for data allocated to each slice:  
         [0038]    The data elements belonging to the same block should be evenly allocated into L-slice such that the L data elements in the block can be accessed simultaneously without conflict.  
         [0039]    If the number of slice L is less then the number of data element in a block, say B=L*M, where B is the number of elements in a block, then there are multiple elements (M) of a block residing in the same slice. In one embodiment, the M data elements are put in a contiguous range on a slice to enable a single burst of block access.  
         [0040]    One application of the invention is illustrated in FIG. 3. In FIG. 3, a 2-dimensional block of 3×4 with L=12 is shown to show the allocation of data. A memory slice ID  302 , a row access  304 , and a random block access  306  are shown. In this way, any 3×4 block in the frame can be accessed in a single cycle.  
         [0041]    Another application of the invention with L=6 and M=2 is illustrated in FIG. 4. A memory slice ID  302 , a row access  304 , and a random block access  306  are shown. In this case, any 3×4 block consists of two elements with the same memory slice ID  302 . That is, the 3×4 block can be accessed in two clock cycles. In addition, as observed in FIG. 3 and FIG. 4, any L pixels in a row access  304  can be accessed in one clock cycle, because there is no slice memory duplication in the set of row pixels.  
         [0042]    Once the data allocation is done properly, the address translation and data multiplexing control in FIG. 2 is designed to reflect the allocation pattern. Note that in one embodiment of the invention, the number of dimension n, the number of block sizes in each dimension, the number of memory slices L can all be parameterized to fit any specific application.  
         [0043]    Multi-Level N-dimensional Signal Storage Memory  
         [0044]    The video ME algorithm has the following unique set of requirements that differentiates itself from a non-real-time CPU system.  
         [0045]    1. Large Capacity  
         [0046]    2. Large Bandwidth  
         [0047]    3. Random Access of 2-dimensional data elements  
         [0048]    4. Low Cost  
         [0049]    Among these requirements, the second and third requirements can be solved by the memory mechanism described previously. However, the large capacity and low cost solution is not met if the n-dimensional storage mechanism is used alone. Furthermore, a large slice number L provides large access bandwidth while increasing the cost at the same time.  
         [0050]    A conventional multi-level cache memory hierarchy can be applied to the n-dimensional memory very well. Note that the high speed and cost of n-dimensional store make a multi-level cache memory hierarchy most suitable for the innermost level of memory closest to the processing engine.  
         [0051]    A 2-level memory embodiment for the n-dimensional store was previously shown in FIG. 2. In this mechanism, the data is organized such that the data is first read from the second level memory  103  (in this embodiment, a SDRAM is used) and stored in the on-chip n-dimensional store. Once the data is in the n-dimensional store, the data can be accessed flexibly and reused many time. In this way, the demand on the external SDRAM  103  bandwidth and the access pattern flexibility is reduced.  
         [0052]    When a SDRAM is used as the second level of memory in 2-level n-dimensional store, some elaboration on the use of SDRAM is needed to support the n-dimensional data structure and overcome the SDRAM architecture limitations. Due to the architecture of a SDRAM design, there are overhead associated with the SDRAM access. Typically, a SDRAM access involves the following steps, each with various delays which incur overhead between bursts:  
         [0053]    Pre-Charge of a previously accessed memory bank  
         [0054]    Sending a RAS command.  
         [0055]    Sending a CAS command  
         [0056]    Without a proper arrangement of the pixel data, the overhead between burst accesses can be very high. On the other hand, the SDRAM provides memory organization of multiple banks allows command issuing and pre-charge independently. With a proper organization of pixel data of a frame, the SDRAM access overhead can be minimized. To do this, the frame buffer data allocation pattern is fixed in the SDRAM as illustrated in FIG. 5. A frame buffer  501  is first pre-partitioned into block of a fixed size (16×16, 8×8, or other fixed size) with each block allocated into one bank of SDRAM memory. The example in FIG. 5 shows 8×8 blocks  504  and a horizontal row of pixels  502 . The blocks  504  are aligned to the fixed grid pattern as explained in  102  of FIG. 1B. These blocks  504  are arranged sequentially into the sequential bank ID  508  as shown in FIG. 5. Within one block, the 8×8 pixel data  610  are arranged in a zigzag order  608  shown in FIG. 6.  
         [0057]    With this, the access patterns to the SDRAM listed in the following are done with zero-overhead:  
         [0058]    Block Burst—The whole block is arranged continuously within a bank. Therefore the access of the whole block is done with one single burst.  
         [0059]    Sequential Blocks Burst—Multiple blocks burst access in the raster scan order (as shown in FIG. 5) are achieved with multiple bursts. Since each block is allocated into a different bank, these bursts commands are pipelined such that there is no overhead.  
         [0060]    Row Access—A row of pixels in the same line can be accessed with multiple bursts. Again, the multiple bursts belongs to different bank, therefore pipelining across burst is possible. Whether there is zero overhead depends on how long is the burst within one block, and depends on CAS and RAS delay of the SDRAM.  
         [0061]    Even though the access to the external SDRAM has very limited access pattern, the multi-level N-dimensional store using the SDRAM as the second or higher level of memory allows flexible access to the data, once the data is read from the SDRAM to the n-dimensional store.  
         [0062]    Parallel Spiral Pattern (PSP) Array Processors for ME Search  
         [0063]    [0063]FIG. 7 shows an array processor implementation of an NDPE in FIG. 1B, in accordance with one embodiment of the invention. The array structure reduces the reference bandwidth need in a ME algorithm by using a parallel spiral search pattern and array-processors. This approach allows multiple processors to share the same data output from the reference buffer. Here the N-D object data (in this case, a Macro Block—MB) is fetched into the current MB register  701 . The 9 processors, J( 0 , 0 )-J( 2 , 2 ), also receive inputs through temp registers  704 ,  706 , and  708 , and can process the search objective function evaluation concurrently with the reference frame data coming from the high speed data bus (NDDB)  106 . The outputs of the 9 processors, J( 0 , 0 )-J( 2 , 2 ), are received by a motion vector decision making block  710 , which provide motion vectors  712  to the high speed data bus (NDDB)  106 .  
         [0064]    This embodiment of the invention exploits the fixed search/access pattern nature in the ME algorithm. One way to share the 2-level memory output is to pre-specify the search pattern in the ME algorithm such that multiple search points are done in parallel. Traditionally, the ME algorithm uses various algorithms. One embodiment uses a spiral search that follows a pre-specified search trace until it eventually finds the best search point.  
         [0065]    [0065]FIG. 8 illustrates a spiral search with a step size of 4 pixels, in accordance with one embodiment of the invention. In order to allow the parallelism of search with fixed access memory access pattern, this embodiment of the invention uses a search pattern  804  called a “Parallel Spiral Search” to search pixels  802 .  
         [0066]    [0066]FIG. 9 shows an example of the parallel spiral pattern  902  with P search points in parallel, with P=9 in this example to search pixels  802 . With the P search points processing in parallel in a fixed pattern, e.g., a 3×3 grid pattern, the input data can be further analyzed to enhance the sharing and reduce the memory bandwidth usage.  
         [0067]    One embodiment of this concept is shown in FIG. 10. Each of the search points in FIG. 10 specifies the location where a cost function evaluation is to be performed. In this case, the cost function is assumed to be based on a 16×16 size block. The search-points  1 ,  2  and  3  share 16 pixels out of the 24 pixels input in each row of pixels  802 . In this way, when the first row is read from the reference buffer, it is shared by all three search-points  1 ,  2 , and  3 . Starting from row  5 , the data is shared by search-points  1 ,  2 ,  3 ,  4 ,  5 , and  6 . Starting from the ninth row, the data is shared by all nine search-points,  1 - 9 . Since the nine search-points are arranged in a fixed 3×3 grid, the access pattern for reference buffer is fixed and easily designed to reuse the data when it is read out from the buffer. Note that in this array processing architecture based on the parallel spiral search pattern, the search pattern step-size, and the array size in x and y dimensions are all parameters that can be set to any specific value.  
         [0068]    PSP Array Processors with N-dimensional Memory Storage for ME Search  
         [0069]    Alternately, the PSP array processor can also go in a column of data, or a block of data (e.g., 4×4) if a n-dimensional memory is used with the parallel spiral array processor. An embodiment of this combination is shown in FIG. 11. Once again, the search-points  1 ,  2  and  3  share 16 pixels out of the 24 pixels input in each row of pixels  802 . In this way, when the first row is read from the reference buffer, it is shared by all three search-points:  1 ,  2 , and  3 . Starting from row  5 , the data is shared by search-points:  1 ,  2 ,  3 ,  4 ,  5 , and  6 . Starting from the ninth row, the data is shared by all nine search-points:  1 ,  2 ,  3 ,  4 ,  5 ,  6 ,  7 ,  8 , and  9 .  
         [0070]    The use of parallel spiral array processor with the n-dimensional store provides a better performance. Without the n-dimensional store, only a row or column of data is read and shared by the array processor. Assuming that the reference buffer has a data width of 16 pixels providing input data of 16 pixels at a time, consider the case in FIG. 11. If there is no n-dimensional store available, only a row or a column of 16 pixels are read at a time. To access the total of 24 rows of 24 pixels each, 48 cycles is needed and is shared by 9 processors. In this way, the number of cycles per processor is 48/9=5.33.  
         [0071]    If an n-dimensional store is available to allow access of a 4×4 block in one cycle, a total of 36 cycles is needed. The number of cycle per processor in this case is 36/9=4. Note that without the PSP and array processor, the number of cycle is 16 cycles per processor. The performance improves from 16 to 5.33 for PSP processor alone, and to 4 for PSP with n-dimensional store.  
         [0072]    In summary, the array processor architecture can be used alone, or with the n-dimensional memory as taught. The usage of the “Parallel Spiral Pattern with Array processor” with the “2-level Memory” enables a more efficient implementation of ME algorithm to search many more points as compared with traditional single spiral point search pattern, and therefore achieve much higher compression performance.  
         [0073]    In the description herein, numerous specific details are provided, such as the description of system components and methods, to provide a thorough understanding of embodiments of the invention. One skilled in relevant arts will recognize, however, that the invention can be practiced without one or more of the specific details, or with other systems, methods, components, materials, parts, and the like. In other instances, well-known structures, materials, or operations are not shown or described in detail to avoid obscuring aspects of the invention.  
         [0074]    Reference throughout this specification to “one embodiment” or “an embodiment” means that a particular feature, structure, or characteristic described in connection with the embodiment is included in at least one embodiment of the present invention. Thus, the appearance of the phrases “in one embodiment” or “in an embodiment” in various places throughout this specification are not necessarily all referring to the same embodiment. Furthermore, the particular features, structures, or characteristics may be combined in any suitable manner in one or more embodiments.