A method of audio fingerprinting comprising: obtaining audio samples of a piece of audio, each of the audio samples corresponding to a specific time; generating frequency representations of the audio samples, the frequency representations being divided in frequency bands; identifying energy regions in the frequency bands, each of the energy regions being one of an increasing energy region and a decreasing energy region, an increasing energy region defined as a time region within which audio energy increases from a start time to an end time of the time region and a decreasing energy region defined as a time region within which audio energy decreases from a start time to an end time of the time region; analyzing portions of the identified energy regions appearing within time windows to generate hashes of features of the piece of audio, each hash of features corresponding to portions of the identified energy regions appearing in a respective time window, each feature defined as a numeric value that encodes information representing: a frequency band of an energy region appearing in the respective time window, whether the energy region appearing in the respective time window is an increasing energy region or whether the energy region appearing in the respective time window is a decreasing energy region, and a placement of the energy region appearing in the respective time window, the placement of the energy region appearing in the respective time window corresponding to one of: whether the energy region appearing in the respective time window starts before and ends after the respective time window, whether the energy region appearing in the respective time window starts before and ends within the respective time window, whether the energy region appearing in the respective time window starts within and ends after the respective time window, and whether the energy region appearing in the respective time window starts within and ends within the respective time window; and storing each hash of features together with timing information from the energy regions within the respective time window. obtaining audio samples of a piece of audio, each of the audio samples corresponding to a specific time; generating frequency representations of the audio samples, the frequency representations being divided in frequency bands; identifying energy regions in the frequency bands, each of the energy regions being one of an increasing energy region and a decreasing energy region, an increasing energy region defined as a time region within which audio energy increases from a start time to an end time of the time region and a decreasing energy region defined as a time region within which audio energy decreases from a start time to an end time of the time region; analyzing portions of the identified energy regions appearing within time windows to generate hashes of features of the piece of audio, each hash of features corresponding to portions of the identified energy regions appearing in a respective time window, each feature defined as a numeric value that encodes information representing: a frequency band of an energy region appearing in the respective time window, whether the energy region appearing in the respective time window is an increasing energy region or whether the energy region appearing in the respective time window is a decreasing energy region, and a placement of the energy region appearing in the respective time window, the placement of the energy region appearing in the respective time window corresponding to one of: whether the energy region appearing in the respective time window starts before and ends after the respective time window, whether the energy region appearing in the respective time window starts before and ends within the respective time window, whether the energy region appearing in the respective time window starts within and ends after the respective time window, and whether the energy region appearing in the respective time window starts within and ends within the respective time window; and whether the energy region appearing in the respective time window starts before and ends after the respective time window, whether the energy region appearing in the respective time window starts before and ends within the respective time window, whether the energy region appearing in the respective time window starts within and ends after the respective time window, and whether the energy region appearing in the respective time window starts within and ends within the respective time window; and storing each hash of features together with timing information from the energy regions within the respective time window.